summaryrefslogtreecommitdiff
path: root/arch/arm64/include/asm/tlbflush.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/include/asm/tlbflush.h')
-rw-r--r--arch/arm64/include/asm/tlbflush.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h
index 875f7440305f..7d2fe5be486d 100644
--- a/arch/arm64/include/asm/tlbflush.h
+++ b/arch/arm64/include/asm/tlbflush.h
@@ -108,7 +108,8 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
dsb();
if (cpumask_ran_on_only_one(mm_cpumask(mm)))
asm("tlbi aside1, %0" : : "r" (asid));
- else
+ barrier();
+ if (!cpumask_ran_on_only_one(mm_cpumask(mm)))
asm("tlbi aside1is, %0" : : "r" (asid));
dsb();
}
@@ -122,7 +123,8 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
dsb();
if (cpumask_ran_on_only_one(mm_cpumask(vma->vm_mm)))
asm("tlbi vae1, %0" : : "r" (addr));
- else
+ barrier();
+ if (!cpumask_ran_on_only_one(mm_cpumask(vma->vm_mm)))
asm("tlbi vae1is, %0" : : "r" (addr));
dsb();
}
@@ -130,16 +132,19 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- if (cpumask_ran_on_only_one(mm_cpumask(vma->vm_mm)))
+ if (cpumask_ran_on_only_one(mm_cpumask(vma->vm_mm))){
if (end - start > FLUSH_TLB_ALL_THRESHOLD)
local_flush_tlb_all();
else
__local_cpu_flush_user_tlb_range(start,end,vma);
- else
+ }
+ barrier();
+ if (!cpumask_ran_on_only_one(mm_cpumask(vma->vm_mm))){
if (end - start > FLUSH_TLB_ALL_THRESHOLD)
flush_tlb_all();
else
__cpu_flush_user_tlb_range(start,end,vma);
+ }
}
static inline void flush_tlb_kernel_range(unsigned long start,