From: Sanath Kumar Date: Wed, 11 Jan 2017 15:35:46 +0000 (-0600) Subject: sparc64: Skip flushing TLBs if there are no mm_users X-Git-Tag: v4.1.12-92~1^2~20 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=412a465775bd4a9dab03a39669ba26be37bcabe4;p=users%2Fjedix%2Flinux-maple.git 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 --- diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index 5f881980cb664..7963bae449279 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(); }