diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/mm/memory.c b/mm/memory.c index 2466d1250231..91f69459d3e8 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; | 
