diff options
Diffstat (limited to 'mm/slab.c')
| -rw-r--r-- | mm/slab.c | 21 |
1 files changed, 15 insertions, 6 deletions
| @@ -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); |
