diff options
author | Christoph Lameter <clameter@sgi.com> | 2007-12-17 19:20:27 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-17 22:28:17 -0500 |
commit | 421d99193537a6522aac2148286f08792167d5fd (patch) | |
tree | 1d2d8e83ade8002be9d7284be720dc7cbdaccb1a /include/asm-generic/tlb.h | |
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>
Diffstat (limited to 'include/asm-generic/tlb.h')
-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 f490e43a90b9..799307eea40f 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #define _ASM_GENERIC__TLB_H | 14 | #define _ASM_GENERIC__TLB_H |
15 | 15 | ||
16 | #include <linux/swap.h> | 16 | #include <linux/swap.h> |
17 | #include <linux/quicklist.h> | ||
17 | #include <asm/pgalloc.h> | 18 | #include <asm/pgalloc.h> |
18 | #include <asm/tlbflush.h> | 19 | #include <asm/tlbflush.h> |
19 | 20 | ||
@@ -85,6 +86,9 @@ tlb_flush_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) | |||
85 | static inline void | 86 | static inline void |
86 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) | 87 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) |
87 | { | 88 | { |
89 | #ifdef CONFIG_QUICKLIST | ||
90 | tlb->need_flush += &__get_cpu_var(quicklist)[0].nr_pages != 0; | ||
91 | #endif | ||
88 | tlb_flush_mmu(tlb, start, end); | 92 | tlb_flush_mmu(tlb, start, end); |
89 | 93 | ||
90 | /* keep the page table cache within bounds */ | 94 | /* keep the page table cache within bounds */ |