|
@@ -1514,15 +1514,19 @@ static inline void *acquire_slab(struct kmem_cache *s,
|
|
|
freelist = page->freelist;
|
|
|
counters = page->counters;
|
|
|
new.counters = counters;
|
|
|
- if (mode)
|
|
|
+ if (mode) {
|
|
|
new.inuse = page->objects;
|
|
|
+ new.freelist = NULL;
|
|
|
+ } else {
|
|
|
+ new.freelist = freelist;
|
|
|
+ }
|
|
|
|
|
|
VM_BUG_ON(new.frozen);
|
|
|
new.frozen = 1;
|
|
|
|
|
|
} while (!__cmpxchg_double_slab(s, page,
|
|
|
freelist, counters,
|
|
|
- NULL, new.counters,
|
|
|
+ new.freelist, new.counters,
|
|
|
"lock and freeze"));
|
|
|
|
|
|
remove_partial(n, page);
|
|
@@ -1564,7 +1568,6 @@ static void *get_partial_node(struct kmem_cache *s,
|
|
|
object = t;
|
|
|
available = page->objects - page->inuse;
|
|
|
} else {
|
|
|
- page->freelist = t;
|
|
|
available = put_cpu_partial(s, page, 0);
|
|
|
stat(s, CPU_PARTIAL_NODE);
|
|
|
}
|