Message ID | 20120615155432.GA5498@breakpoint.cc |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
On Fri, Jun 15, 2012 at 05:54:32PM +0200, Sebastian Andrzej Siewior wrote: > From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > > If we first remove the SLAB flag followed by the PFMEMALLOC flag then the > removal of the latter will trigger the VM_BUG_ON() as it can be seen in > | kernel BUG at include/linux/page-flags.h:474! > | invalid opcode: 0000 [#1] PREEMPT SMP > | Call Trace: > | [<c10e2d77>] slab_destroy+0x27/0x70 > | [<c10e3285>] drain_freelist+0x55/0x90 > | [<c10e344e>] __cache_shrink+0x6e/0x90 > | [<c14e3211>] ? acpi_sleep_init+0xcf/0xcf > | [<c10e349d>] kmem_cache_shrink+0x2d/0x40 > > because the SLAB flag is gone. This patch simply changes the order. > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Grr, yes of course. Thanks very much. I've folded this into patch 2 and preserved credit.
diff --git a/mm/slab.c b/mm/slab.c index 00c601b..b1a39f7 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -2007,8 +2007,8 @@ static void kmem_freepages(struct kmem_cache *cachep, void *addr) NR_SLAB_UNRECLAIMABLE, nr_freed); while (i--) { BUG_ON(!PageSlab(page)); - __ClearPageSlab(page); __ClearPageSlabPfmemalloc(page); + __ClearPageSlab(page); page++; } if (current->reclaim_state) diff --git a/mm/slub.c b/mm/slub.c index f8cbec4..d753146 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1417,8 +1417,8 @@ static void __free_slab(struct kmem_cache *s, struct page *page) NR_SLAB_RECLAIMABLE : NR_SLAB_UNRECLAIMABLE, -pages); - __ClearPageSlab(page); __ClearPageSlabPfmemalloc(page); + __ClearPageSlab(page); reset_page_mapcount(page); if (current->reclaim_state) current->reclaim_state->reclaimed_slab += pages;