Skip to content

Commit fd4d9c7

Browse files
thejhtorvalds
authored andcommitted
mm: slub: add missing TID bump in kmem_cache_alloc_bulk()
When kmem_cache_alloc_bulk() attempts to allocate N objects from a percpu freelist of length M, and N > M > 0, it will first remove the M elements from the percpu freelist, then call ___slab_alloc() to allocate the next element and repopulate the percpu freelist. ___slab_alloc() can re-enable IRQs via allocate_slab(), so the TID must be bumped before ___slab_alloc() to properly commit the freelist head change. Fix it by unconditionally bumping c->tid when entering the slowpath. Cc: [email protected] Fixes: ebe909e ("slub: improve bulk alloc strategy") Signed-off-by: Jann Horn <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent ac309e7 commit fd4d9c7

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

mm/slub.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3174,6 +3174,15 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
31743174
void *object = c->freelist;
31753175

31763176
if (unlikely(!object)) {
3177+
/*
3178+
* We may have removed an object from c->freelist using
3179+
* the fastpath in the previous iteration; in that case,
3180+
* c->tid has not been bumped yet.
3181+
* Since ___slab_alloc() may reenable interrupts while
3182+
* allocating memory, we should bump c->tid now.
3183+
*/
3184+
c->tid = next_tid(c->tid);
3185+
31773186
/*
31783187
* Invoking slow path likely have side-effect
31793188
* of re-populating per CPU c->freelist

0 commit comments

Comments
 (0)