diff options
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -1514,15 +1514,19 @@ static inline void *acquire_slab(struct kmem_cache *s, | |||
1514 | freelist = page->freelist; | 1514 | freelist = page->freelist; |
1515 | counters = page->counters; | 1515 | counters = page->counters; |
1516 | new.counters = counters; | 1516 | new.counters = counters; |
1517 | if (mode) | 1517 | if (mode) { |
1518 | new.inuse = page->objects; | 1518 | new.inuse = page->objects; |
1519 | new.freelist = NULL; | ||
1520 | } else { | ||
1521 | new.freelist = freelist; | ||
1522 | } | ||
1519 | 1523 | ||
1520 | VM_BUG_ON(new.frozen); | 1524 | VM_BUG_ON(new.frozen); |
1521 | new.frozen = 1; | 1525 | new.frozen = 1; |
1522 | 1526 | ||
1523 | } while (!__cmpxchg_double_slab(s, page, | 1527 | } while (!__cmpxchg_double_slab(s, page, |
1524 | freelist, counters, | 1528 | freelist, counters, |
1525 | NULL, new.counters, | 1529 | new.freelist, new.counters, |
1526 | "lock and freeze")); | 1530 | "lock and freeze")); |
1527 | 1531 | ||
1528 | remove_partial(n, page); | 1532 | remove_partial(n, page); |
@@ -1564,7 +1568,6 @@ static void *get_partial_node(struct kmem_cache *s, | |||
1564 | object = t; | 1568 | object = t; |
1565 | available = page->objects - page->inuse; | 1569 | available = page->objects - page->inuse; |
1566 | } else { | 1570 | } else { |
1567 | page->freelist = t; | ||
1568 | available = put_cpu_partial(s, page, 0); | 1571 | available = put_cpu_partial(s, page, 0); |
1569 | stat(s, CPU_PARTIAL_NODE); | 1572 | stat(s, CPU_PARTIAL_NODE); |
1570 | } | 1573 | } |