quicklist: Set tlb->need_flush if pages are remaining in quicklist 0
authorChristoph Lameter <clameter@sgi.com>
Tue, 18 Dec 2007 00:20:27 +0000 (16:20 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 18 Dec 2007 03:28:17 +0000 (19:28 -0800)
This ensures that the quicklists are drained. Otherwise draining may only
occur when the processor reaches an idle state.

Fixes fatal leakage of pgd_t's on 2.6.22 and later.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Reported-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/asm-generic/tlb.h

index f490e43a90b90a09e1cfe78a9f1215b66d3df74e..799307eea40ffcc6efe6484a670737c09fa7478a 100644 (file)
@@ -14,6 +14,7 @@
 #define _ASM_GENERIC__TLB_H
 
 #include <linux/swap.h>
+#include <linux/quicklist.h>
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 
@@ -85,6 +86,9 @@ tlb_flush_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
 static inline void
 tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)
 {
+#ifdef CONFIG_QUICKLIST
+       tlb->need_flush += &__get_cpu_var(quicklist)[0].nr_pages != 0;
+#endif
        tlb_flush_mmu(tlb, start, end);
 
        /* keep the page table cache within bounds */