diff options
author | Christoph Lameter <clameter@sgi.com> | 2007-12-17 16:20:27 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-17 19:28:17 -0800 |
commit | 421d99193537a6522aac2148286f08792167d5fd (patch) | |
tree | 1d2d8e83ade8002be9d7284be720dc7cbdaccb1a | |
parent | 3811dbf67162bd08412f1b0e02e554f353e93bdb (diff) |
quicklist: Set tlb->need_flush if pages are remaining in quicklist 0
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>
-rw-r--r-- | include/asm-generic/tlb.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index f490e43a90b..799307eea40 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h @@ -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 */ |