diff options
Diffstat (limited to 'arch/ia64/mm/tlb.c')
-rw-r--r-- | arch/ia64/mm/tlb.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c index 464557e4ed82..99ea8c70f408 100644 --- a/arch/ia64/mm/tlb.c +++ b/arch/ia64/mm/tlb.c | |||
@@ -86,10 +86,15 @@ wrap_mmu_context (struct mm_struct *mm) | |||
86 | } | 86 | } |
87 | 87 | ||
88 | void | 88 | void |
89 | ia64_global_tlb_purge (unsigned long start, unsigned long end, unsigned long nbits) | 89 | ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long nbits) |
90 | { | 90 | { |
91 | static DEFINE_SPINLOCK(ptcg_lock); | 91 | static DEFINE_SPINLOCK(ptcg_lock); |
92 | 92 | ||
93 | if (mm != current->active_mm) { | ||
94 | flush_tlb_all(); | ||
95 | return; | ||
96 | } | ||
97 | |||
93 | /* HW requires global serialization of ptc.ga. */ | 98 | /* HW requires global serialization of ptc.ga. */ |
94 | spin_lock(&ptcg_lock); | 99 | spin_lock(&ptcg_lock); |
95 | { | 100 | { |
@@ -135,15 +140,12 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long | |||
135 | unsigned long size = end - start; | 140 | unsigned long size = end - start; |
136 | unsigned long nbits; | 141 | unsigned long nbits; |
137 | 142 | ||
143 | #ifndef CONFIG_SMP | ||
138 | if (mm != current->active_mm) { | 144 | if (mm != current->active_mm) { |
139 | /* this does happen, but perhaps it's not worth optimizing for? */ | ||
140 | #ifdef CONFIG_SMP | ||
141 | flush_tlb_all(); | ||
142 | #else | ||
143 | mm->context = 0; | 145 | mm->context = 0; |
144 | #endif | ||
145 | return; | 146 | return; |
146 | } | 147 | } |
148 | #endif | ||
147 | 149 | ||
148 | nbits = ia64_fls(size + 0xfff); | 150 | nbits = ia64_fls(size + 0xfff); |
149 | while (unlikely (((1UL << nbits) & purge.mask) == 0) && (nbits < purge.max_bits)) | 151 | while (unlikely (((1UL << nbits) & purge.mask) == 0) && (nbits < purge.max_bits)) |
@@ -153,7 +155,7 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long | |||
153 | start &= ~((1UL << nbits) - 1); | 155 | start &= ~((1UL << nbits) - 1); |
154 | 156 | ||
155 | # ifdef CONFIG_SMP | 157 | # ifdef CONFIG_SMP |
156 | platform_global_tlb_purge(start, end, nbits); | 158 | platform_global_tlb_purge(mm, start, end, nbits); |
157 | # else | 159 | # else |
158 | do { | 160 | do { |
159 | ia64_ptcl(start, (nbits<<2)); | 161 | ia64_ptcl(start, (nbits<<2)); |