From 412a465775bd4a9dab03a39669ba26be37bcabe4 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Date: Wed, 11 Jan 2017 09:35:46 -0600 Subject: [PATCH] sparc64: Skip flushing TLBs if there are no mm_users Orabug: 25379970 Saves time when smp_flush_tlb_page/smp_flush_tlb_pending is called during do_exit(...). Without this patch, killing processes had performance bottle neck in these functions due to unnecessary xcalls made to flush TLBs. Reviewed-by: Nitin Gupta Signed-off-by: Bob Picco Signed-off-by: Sanath Kumar Signed-off-by: Allen Pais --- arch/sparc/kernel/smp_64.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index 5f881980cb66..7963bae44927 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -1112,6 +1112,9 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long info.nr = nr; info.vaddrs = vaddrs; + if (atomic_read(&mm->mm_users) < 1) + goto done; + if (mm == current->mm && atomic_read(&mm->mm_users) == 1) cpumask_copy(mm_cpumask(mm), cpumask_of(cpu)); else @@ -1119,7 +1122,7 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long &info, 1); __flush_tlb_pending(ctx, nr, vaddrs); - +done: put_cpu(); } @@ -1128,6 +1131,9 @@ void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) unsigned long context = CTX_HWBITS(mm->context); int cpu = get_cpu(); + if (atomic_read(&mm->mm_users) < 1) + goto done; + if (mm == current->mm && atomic_read(&mm->mm_users) == 1) cpumask_copy(mm_cpumask(mm), cpumask_of(cpu)); else @@ -1135,7 +1141,7 @@ void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr) context, vaddr, 0, mm_cpumask(mm)); __flush_tlb_page(context, vaddr); - +done: put_cpu(); } -- 2.51.0