aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/mm/tlb.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64/mm/tlb.c')
-rw-r--r--arch/ia64/mm/tlb.c16
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
88void 88void
89ia64_global_tlb_purge (unsigned long start, unsigned long end, unsigned long nbits) 89ia64_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));