Skip to content

Commit

Permalink
slub: Acquire_slab() avoid loop
Browse files Browse the repository at this point in the history
Avoid the loop in acquire slab and simply fail if there is a conflict.

This will cause the next page on the list to be considered.

Acked-by: David Rientjes <[email protected]>
Signed-off-by: Christoph Lameter <[email protected]>
Signed-off-by: Pekka Enberg <[email protected]>
  • Loading branch information
Christoph Lameter authored and penberg committed Jun 1, 2012
1 parent 507effe commit 7ced371
Showing 1 changed file with 15 additions and 13 deletions.
28 changes: 15 additions & 13 deletions mm/slub.c
Original file line number Diff line number Diff line change
Expand Up @@ -1490,12 +1490,12 @@ static inline void remove_partial(struct kmem_cache_node *n,
}

/*
* Lock slab, remove from the partial list and put the object into the
* per cpu freelist.
* Remove slab from the partial list, freeze it and
* return the pointer to the freelist.
*
* Returns a list of objects or NULL if it fails.
*
* Must hold list_lock.
* Must hold list_lock since we modify the partial list.
*/
static inline void *acquire_slab(struct kmem_cache *s,
struct kmem_cache_node *n, struct page *page,
Expand All @@ -1510,22 +1510,24 @@ static inline void *acquire_slab(struct kmem_cache *s,
* The old freelist is the list of objects for the
* per cpu allocation list.
*/
do {
freelist = page->freelist;
counters = page->counters;
new.counters = counters;
if (mode)
new.inuse = page->objects;
freelist = page->freelist;
counters = page->counters;
new.counters = counters;
if (mode)
new.inuse = page->objects;

VM_BUG_ON(new.frozen);
new.frozen = 1;
VM_BUG_ON(new.frozen);
new.frozen = 1;

} while (!__cmpxchg_double_slab(s, page,
if (!__cmpxchg_double_slab(s, page,
freelist, counters,
NULL, new.counters,
"lock and freeze"));
"acquire_slab"))

return NULL;

remove_partial(n, page);
WARN_ON(!freelist);
return freelist;
}

Expand Down

0 comments on commit 7ced371

Please sign in to comment.