aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-12-17 19:20:27 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-12-17 22:28:17 -0500
commit421d99193537a6522aac2148286f08792167d5fd (patch)
tree1d2d8e83ade8002be9d7284be720dc7cbdaccb1a /include
parent3811dbf67162bd08412f1b0e02e554f353e93bdb (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')
-rw-r--r--include/asm-generic/tlb.h4
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)
85static inline void 86static inline void
86tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) 87tlb_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 */