diff options
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -3629,6 +3629,7 @@ static void list_slab_objects(struct kmem_cache *s, struct page *page, | |||
3629 | */ | 3629 | */ |
3630 | static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) | 3630 | static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) |
3631 | { | 3631 | { |
3632 | LIST_HEAD(discard); | ||
3632 | struct page *page, *h; | 3633 | struct page *page, *h; |
3633 | 3634 | ||
3634 | BUG_ON(irqs_disabled()); | 3635 | BUG_ON(irqs_disabled()); |
@@ -3636,13 +3637,16 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) | |||
3636 | list_for_each_entry_safe(page, h, &n->partial, lru) { | 3637 | list_for_each_entry_safe(page, h, &n->partial, lru) { |
3637 | if (!page->inuse) { | 3638 | if (!page->inuse) { |
3638 | remove_partial(n, page); | 3639 | remove_partial(n, page); |
3639 | discard_slab(s, page); | 3640 | list_add(&page->lru, &discard); |
3640 | } else { | 3641 | } else { |
3641 | list_slab_objects(s, page, | 3642 | list_slab_objects(s, page, |
3642 | "Objects remaining in %s on __kmem_cache_shutdown()"); | 3643 | "Objects remaining in %s on __kmem_cache_shutdown()"); |
3643 | } | 3644 | } |
3644 | } | 3645 | } |
3645 | spin_unlock_irq(&n->list_lock); | 3646 | spin_unlock_irq(&n->list_lock); |
3647 | |||
3648 | list_for_each_entry_safe(page, h, &discard, lru) | ||
3649 | discard_slab(s, page); | ||
3646 | } | 3650 | } |
3647 | 3651 | ||
3648 | /* | 3652 | /* |