diff options
Diffstat (limited to 'arch/ia64/mm/tlb.c')
-rw-r--r-- | arch/ia64/mm/tlb.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c index 6a4eec9113e8..4dbbca0b5e9c 100644 --- a/arch/ia64/mm/tlb.c +++ b/arch/ia64/mm/tlb.c | |||
@@ -156,17 +156,19 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, | |||
156 | nbits = purge.max_bits; | 156 | nbits = purge.max_bits; |
157 | start &= ~((1UL << nbits) - 1); | 157 | start &= ~((1UL << nbits) - 1); |
158 | 158 | ||
159 | # ifdef CONFIG_SMP | ||
160 | platform_global_tlb_purge(mm, start, end, nbits); | ||
161 | # else | ||
162 | preempt_disable(); | 159 | preempt_disable(); |
160 | #ifdef CONFIG_SMP | ||
161 | if (mm != current->active_mm || cpus_weight(mm->cpu_vm_mask) != 1) { | ||
162 | platform_global_tlb_purge(mm, start, end, nbits); | ||
163 | preempt_enable(); | ||
164 | return; | ||
165 | } | ||
166 | #endif | ||
163 | do { | 167 | do { |
164 | ia64_ptcl(start, (nbits<<2)); | 168 | ia64_ptcl(start, (nbits<<2)); |
165 | start += (1UL << nbits); | 169 | start += (1UL << nbits); |
166 | } while (start < end); | 170 | } while (start < end); |
167 | preempt_enable(); | 171 | preempt_enable(); |
168 | # endif | ||
169 | |||
170 | ia64_srlz_i(); /* srlz.i implies srlz.d */ | 172 | ia64_srlz_i(); /* srlz.i implies srlz.d */ |
171 | } | 173 | } |
172 | EXPORT_SYMBOL(flush_tlb_range); | 174 | EXPORT_SYMBOL(flush_tlb_range); |