]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc64: Skip flushing TLBs if there are no mm_users
authorSanath Kumar <sanath.s.kumar@oracle.com>
Wed, 11 Jan 2017 15:35:46 +0000 (09:35 -0600)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 9 Mar 2017 03:30:07 +0000 (19:30 -0800)
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 <nitin.m.gupta@oracle.com>
Signed-off-by: Bob Picco <bob.picco@oracle.com
Signed-off-by: Henry Willard <henry.willard@oracle.com>
Signed-off-by: Sanath Kumar <sanath.s.kumar@oracle.com>
Signed-off-by: Allen Pais <allen.pais@oracle.com>
arch/sparc/kernel/smp_64.c

index 5f881980cb664c05fb0ec9e9068811ba22580f1f..7963bae4492795a72595085e26e6947f834ea534 100644 (file)
@@ -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();
 }