diff options
| -rw-r--r-- | arch/arm/include/asm/tlb.h | 7 | ||||
| -rw-r--r-- | arch/arm64/include/asm/tlb.h | 7 | ||||
| -rw-r--r-- | arch/ia64/include/asm/tlb.h | 9 | ||||
| -rw-r--r-- | arch/s390/include/asm/tlb.h | 8 | ||||
| -rw-r--r-- | arch/sh/include/asm/tlb.h | 6 | ||||
| -rw-r--r-- | arch/um/include/asm/tlb.h | 6 | ||||
| -rw-r--r-- | fs/exec.c | 4 | ||||
| -rw-r--r-- | include/asm-generic/tlb.h | 2 | ||||
| -rw-r--r-- | mm/hugetlb.c | 2 | ||||
| -rw-r--r-- | mm/memory.c | 36 | ||||
| -rw-r--r-- | mm/mmap.c | 4 |
11 files changed, 57 insertions, 34 deletions
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 46e7cfb3e721..0baf7f0d9394 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
| @@ -43,6 +43,7 @@ struct mmu_gather { | |||
| 43 | struct mm_struct *mm; | 43 | struct mm_struct *mm; |
| 44 | unsigned int fullmm; | 44 | unsigned int fullmm; |
| 45 | struct vm_area_struct *vma; | 45 | struct vm_area_struct *vma; |
| 46 | unsigned long start, end; | ||
| 46 | unsigned long range_start; | 47 | unsigned long range_start; |
| 47 | unsigned long range_end; | 48 | unsigned long range_end; |
| 48 | unsigned int nr; | 49 | unsigned int nr; |
| @@ -107,10 +108,12 @@ static inline void tlb_flush_mmu(struct mmu_gather *tlb) | |||
| 107 | } | 108 | } |
| 108 | 109 | ||
| 109 | static inline void | 110 | static inline void |
| 110 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int fullmm) | 111 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) |
| 111 | { | 112 | { |
| 112 | tlb->mm = mm; | 113 | tlb->mm = mm; |
| 113 | tlb->fullmm = fullmm; | 114 | tlb->fullmm = !(start | (end+1)); |
| 115 | tlb->start = start; | ||
| 116 | tlb->end = end; | ||
| 114 | tlb->vma = NULL; | 117 | tlb->vma = NULL; |
| 115 | tlb->max = ARRAY_SIZE(tlb->local); | 118 | tlb->max = ARRAY_SIZE(tlb->local); |
| 116 | tlb->pages = tlb->local; | 119 | tlb->pages = tlb->local; |
diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h index 46b3beb4b773..717031a762c2 100644 --- a/arch/arm64/include/asm/tlb.h +++ b/arch/arm64/include/asm/tlb.h | |||
| @@ -35,6 +35,7 @@ struct mmu_gather { | |||
| 35 | struct mm_struct *mm; | 35 | struct mm_struct *mm; |
| 36 | unsigned int fullmm; | 36 | unsigned int fullmm; |
| 37 | struct vm_area_struct *vma; | 37 | struct vm_area_struct *vma; |
| 38 | unsigned long start, end; | ||
| 38 | unsigned long range_start; | 39 | unsigned long range_start; |
| 39 | unsigned long range_end; | 40 | unsigned long range_end; |
| 40 | unsigned int nr; | 41 | unsigned int nr; |
| @@ -97,10 +98,12 @@ static inline void tlb_flush_mmu(struct mmu_gather *tlb) | |||
| 97 | } | 98 | } |
| 98 | 99 | ||
| 99 | static inline void | 100 | static inline void |
| 100 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int fullmm) | 101 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) |
| 101 | { | 102 | { |
| 102 | tlb->mm = mm; | 103 | tlb->mm = mm; |
| 103 | tlb->fullmm = fullmm; | 104 | tlb->fullmm = !(start | (end+1)); |
| 105 | tlb->start = start; | ||
| 106 | tlb->end = end; | ||
| 104 | tlb->vma = NULL; | 107 | tlb->vma = NULL; |
| 105 | tlb->max = ARRAY_SIZE(tlb->local); | 108 | tlb->max = ARRAY_SIZE(tlb->local); |
| 106 | tlb->pages = tlb->local; | 109 | tlb->pages = tlb->local; |
diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h index ef3a9de01954..bc5efc7c3f3f 100644 --- a/arch/ia64/include/asm/tlb.h +++ b/arch/ia64/include/asm/tlb.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | * unmapping a portion of the virtual address space, these hooks are called according to | 22 | * unmapping a portion of the virtual address space, these hooks are called according to |
| 23 | * the following template: | 23 | * the following template: |
| 24 | * | 24 | * |
| 25 | * tlb <- tlb_gather_mmu(mm, full_mm_flush); // start unmap for address space MM | 25 | * tlb <- tlb_gather_mmu(mm, start, end); // start unmap for address space MM |
| 26 | * { | 26 | * { |
| 27 | * for each vma that needs a shootdown do { | 27 | * for each vma that needs a shootdown do { |
| 28 | * tlb_start_vma(tlb, vma); | 28 | * tlb_start_vma(tlb, vma); |
| @@ -58,6 +58,7 @@ struct mmu_gather { | |||
| 58 | unsigned int max; | 58 | unsigned int max; |
| 59 | unsigned char fullmm; /* non-zero means full mm flush */ | 59 | unsigned char fullmm; /* non-zero means full mm flush */ |
| 60 | unsigned char need_flush; /* really unmapped some PTEs? */ | 60 | unsigned char need_flush; /* really unmapped some PTEs? */ |
| 61 | unsigned long start, end; | ||
| 61 | unsigned long start_addr; | 62 | unsigned long start_addr; |
| 62 | unsigned long end_addr; | 63 | unsigned long end_addr; |
| 63 | struct page **pages; | 64 | struct page **pages; |
| @@ -155,13 +156,15 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb) | |||
| 155 | 156 | ||
| 156 | 157 | ||
| 157 | static inline void | 158 | static inline void |
| 158 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_mm_flush) | 159 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) |
| 159 | { | 160 | { |
| 160 | tlb->mm = mm; | 161 | tlb->mm = mm; |
| 161 | tlb->max = ARRAY_SIZE(tlb->local); | 162 | tlb->max = ARRAY_SIZE(tlb->local); |
| 162 | tlb->pages = tlb->local; | 163 | tlb->pages = tlb->local; |
| 163 | tlb->nr = 0; | 164 | tlb->nr = 0; |
| 164 | tlb->fullmm = full_mm_flush; | 165 | tlb->fullmm = !(start | (end+1)); |
| 166 | tlb->start = start; | ||
| 167 | tlb->end = end; | ||
| 165 | tlb->start_addr = ~0UL; | 168 | tlb->start_addr = ~0UL; |
| 166 | } | 169 | } |
| 167 | 170 | ||
diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h index b75d7d686684..23a64d25f2b1 100644 --- a/arch/s390/include/asm/tlb.h +++ b/arch/s390/include/asm/tlb.h | |||
| @@ -32,6 +32,7 @@ struct mmu_gather { | |||
| 32 | struct mm_struct *mm; | 32 | struct mm_struct *mm; |
| 33 | struct mmu_table_batch *batch; | 33 | struct mmu_table_batch *batch; |
| 34 | unsigned int fullmm; | 34 | unsigned int fullmm; |
| 35 | unsigned long start, unsigned long end; | ||
| 35 | }; | 36 | }; |
| 36 | 37 | ||
| 37 | struct mmu_table_batch { | 38 | struct mmu_table_batch { |
| @@ -48,10 +49,13 @@ extern void tlb_remove_table(struct mmu_gather *tlb, void *table); | |||
| 48 | 49 | ||
| 49 | static inline void tlb_gather_mmu(struct mmu_gather *tlb, | 50 | static inline void tlb_gather_mmu(struct mmu_gather *tlb, |
| 50 | struct mm_struct *mm, | 51 | struct mm_struct *mm, |
| 51 | unsigned int full_mm_flush) | 52 | unsigned long start, |
| 53 | unsigned long end) | ||
| 52 | { | 54 | { |
| 53 | tlb->mm = mm; | 55 | tlb->mm = mm; |
| 54 | tlb->fullmm = full_mm_flush; | 56 | tlb->start = start; |
| 57 | tlb->end = end; | ||
| 58 | tlb->fullmm = !(start | (end+1)); | ||
| 55 | tlb->batch = NULL; | 59 | tlb->batch = NULL; |
| 56 | if (tlb->fullmm) | 60 | if (tlb->fullmm) |
| 57 | __tlb_flush_mm(mm); | 61 | __tlb_flush_mm(mm); |
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index e61d43d9f689..362192ed12fe 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
| @@ -36,10 +36,12 @@ static inline void init_tlb_gather(struct mmu_gather *tlb) | |||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | static inline void | 38 | static inline void |
| 39 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_mm_flush) | 39 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) |
| 40 | { | 40 | { |
| 41 | tlb->mm = mm; | 41 | tlb->mm = mm; |
| 42 | tlb->fullmm = full_mm_flush; | 42 | tlb->start = start; |
| 43 | tlb->end = end; | ||
| 44 | tlb->fullmm = !(start | (end+1)); | ||
| 43 | 45 | ||
| 44 | init_tlb_gather(tlb); | 46 | init_tlb_gather(tlb); |
| 45 | } | 47 | } |
diff --git a/arch/um/include/asm/tlb.h b/arch/um/include/asm/tlb.h index 4febacd1a8a1..29b0301c18aa 100644 --- a/arch/um/include/asm/tlb.h +++ b/arch/um/include/asm/tlb.h | |||
| @@ -45,10 +45,12 @@ static inline void init_tlb_gather(struct mmu_gather *tlb) | |||
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static inline void | 47 | static inline void |
| 48 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_mm_flush) | 48 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) |
| 49 | { | 49 | { |
| 50 | tlb->mm = mm; | 50 | tlb->mm = mm; |
| 51 | tlb->fullmm = full_mm_flush; | 51 | tlb->start = start; |
| 52 | tlb->end = end; | ||
| 53 | tlb->fullmm = !(start | (end+1)); | ||
| 52 | 54 | ||
| 53 | init_tlb_gather(tlb); | 55 | init_tlb_gather(tlb); |
| 54 | } | 56 | } |
| @@ -608,7 +608,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | |||
| 608 | return -ENOMEM; | 608 | |
