diff options
-rw-r--r-- | include/asm-generic/tlb.h | 2 | ||||
-rw-r--r-- | mm/memory.c | 9 |
2 files changed, 11 insertions, 0 deletions
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index 75e888b3cfd2..ed6642ad03e0 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h | |||
@@ -86,6 +86,8 @@ struct mmu_gather { | |||
86 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | 86 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
87 | struct mmu_table_batch *batch; | 87 | struct mmu_table_batch *batch; |
88 | #endif | 88 | #endif |
89 | unsigned long start; | ||
90 | unsigned long end; | ||
89 | unsigned int need_flush : 1, /* Did free PTEs */ | 91 | unsigned int need_flush : 1, /* Did free PTEs */ |
90 | fast_mode : 1; /* No batching */ | 92 | fast_mode : 1; /* No batching */ |
91 | 93 | ||
diff --git a/mm/memory.c b/mm/memory.c index 1b7dc662bf9f..32c99433cfdf 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -206,6 +206,8 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm) | |||
206 | tlb->mm = mm; | 206 | tlb->mm = mm; |
207 | 207 | ||
208 | tlb->fullmm = fullmm; | 208 | tlb->fullmm = fullmm; |
209 | tlb->start = -1UL; | ||
210 | tlb->end = 0; | ||
209 | tlb->need_flush = 0; | 211 | tlb->need_flush = 0; |
210 | tlb->fast_mode = (num_possible_cpus() == 1); | 212 | tlb->fast_mode = (num_possible_cpus() == 1); |
211 | tlb->local.next = NULL; | 213 | tlb->local.next = NULL; |
@@ -248,6 +250,8 @@ void tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long e | |||
248 | { | 250 | { |
249 | struct mmu_gather_batch *batch, *next; | 251 | struct mmu_gather_batch *batch, *next; |
250 | 252 | ||
253 | tlb->start = start; | ||
254 | tlb->end = end; | ||
251 | tlb_flush_mmu(tlb); | 255 | tlb_flush_mmu(tlb); |
252 | 256 | ||
253 | /* keep the page table cache within bounds */ | 257 | /* keep the page table cache within bounds */ |
@@ -1204,6 +1208,11 @@ again: | |||
1204 | */ | 1208 | */ |
1205 | if (force_flush) { | 1209 | if (force_flush) { |
1206 | force_flush = 0; | 1210 | force_flush = 0; |
1211 | |||
1212 | #ifdef HAVE_GENERIC_MMU_GATHER | ||
1213 | tlb->start = addr; | ||
1214 | tlb->end = end; | ||
1215 | #endif | ||
1207 | tlb_flush_mmu(tlb); | 1216 | tlb_flush_mmu(tlb); |
1208 | if (addr != end) | 1217 | if (addr != end) |
1209 | goto again; | 1218 | goto again; |