aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/slab.c')
-rw-r--r--mm/slab.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/mm/slab.c b/mm/slab.c
index 73fe23e649c9..91c1863df93d 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -666,8 +666,10 @@ static struct alien_cache *__alloc_alien_cache(int node, int entries,
666 struct alien_cache *alc = NULL; 666 struct alien_cache *alc = NULL;
667 667
668 alc = kmalloc_node(memsize, gfp, node); 668 alc = kmalloc_node(memsize, gfp, node);
669 init_arraycache(&alc->ac, entries, batch); 669 if (alc) {
670 spin_lock_init(&alc->lock); 670 init_arraycache(&alc->ac, entries, batch);
671 spin_lock_init(&alc->lock);
672 }
671 return alc; 673 return alc;
672} 674}
673 675
@@ -2357,7 +2359,7 @@ static void *alloc_slabmgmt(struct kmem_cache *cachep,
2357 void *freelist; 2359 void *freelist;
2358 void *addr = page_address(page); 2360 void *addr = page_address(page);
2359 2361
2360 page->s_mem = kasan_reset_tag(addr) + colour_off; 2362 page->s_mem = addr + colour_off;
2361 page->active = 0; 2363 page->active = 0;
2362 2364
2363 if (OBJFREELIST_SLAB(cachep)) 2365 if (OBJFREELIST_SLAB(cachep))
@@ -2366,6 +2368,7 @@ static void *alloc_slabmgmt(struct kmem_cache *cachep,
2366 /* Slab management obj is off-slab. */ 2368 /* Slab management obj is off-slab. */
2367 freelist = kmem_cache_alloc_node(cachep->freelist_cache, 2369 freelist = kmem_cache_alloc_node(cachep->freelist_cache,
2368 local_flags, nodeid); 2370 local_flags, nodeid);
2371 freelist = kasan_reset_tag(freelist);
2369 if (!freelist) 2372 if (!freelist)
2370 return NULL; 2373 return NULL;
2371 } else { 2374 } else {
@@ -2679,6 +2682,13 @@ static struct page *cache_grow_begin(struct kmem_cache *cachep,
2679 2682
2680 offset *= cachep->colour_off; 2683 offset *= cachep->colour_off;
2681 2684
2685 /*
2686 * Call kasan_poison_slab() before calling alloc_slabmgmt(), so
2687 * page_address() in the latter returns a non-tagged pointer,
2688 * as it should be for slab pages.
2689 */
2690 kasan_poison_slab(page);
2691
2682 /* Get slab management. */ 2692 /* Get slab management. */
2683 freelist = alloc_slabmgmt(cachep, page, offset, 2693 freelist = alloc_slabmgmt(cachep, page, offset,
2684 local_flags & ~GFP_CONSTRAINT_MASK, page_node); 2694 local_flags & ~GFP_CONSTRAINT_MASK, page_node);
@@ -2687,7 +2697,6 @@ static struct page *cache_grow_begin(struct kmem_cache *cachep,
2687 2697
2688 slab_map_pages(cachep, page, freelist); 2698 slab_map_pages(cachep, page, freelist);
2689 2699
2690 kasan_poison_slab(page);
2691 cache_init_objs(cachep, page); 2700 cache_init_objs(cachep, page);
2692 2701
2693 if (gfpflags_allow_blocking(local_flags)) 2702 if (gfpflags_allow_blocking(local_flags))
@@ -3538,7 +3547,6 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
3538{ 3547{
3539 void *ret = slab_alloc(cachep, flags, _RET_IP_); 3548 void *ret = slab_alloc(cachep, flags, _RET_IP_);
3540 3549
3541 ret = kasan_slab_alloc(cachep, ret, flags);
3542 trace_kmem_cache_alloc(_RET_IP_, ret, 3550 trace_kmem_cache_alloc(_RET_IP_, ret,
3543 cachep->object_size, cachep->size, flags); 3551 cachep->object_size, cachep->size, flags);
3544 3552
@@ -3628,7 +3636,6 @@ void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
3628{ 3636{
3629 void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_); 3637 void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
3630 3638
3631 ret = kasan_slab_alloc(cachep, ret, flags);
3632 trace_kmem_cache_alloc_node(_RET_IP_, ret, 3639 trace_kmem_cache_alloc_node(_RET_IP_, ret,
3633 cachep->object_size, cachep->size, 3640 cachep->object_size, cachep->size,
3634 flags, nodeid); 3641 flags, nodeid);
@@ -4406,6 +4413,8 @@ void __check_heap_object(const void *ptr, unsigned long n, struct page *page,
4406 unsigned int objnr; 4413 unsigned int objnr;
4407 unsigned long offset; 4414 unsigned long offset;
4408 4415
4416 ptr = kasan_reset_tag(ptr);
4417
4409 /* Find and validate object. */ 4418 /* Find and validate object. */
4410 cachep = page->slab_cache; 4419 cachep = page->slab_cache;
4411 objnr = obj_to_index(cachep, page, (void *)ptr); 4420 objnr = obj_to_index(cachep, page, (void *)ptr);