Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc64 smp_tlb_flush_pte(): Avoid run-time check f...



details:   https://anonhg.NetBSD.org/src/rev/fca2e2dc7693
branches:  trunk
changeset: 805467:fca2e2dc7693
user:      palle <palle%NetBSD.org@localhost>
date:      Sat Jan 03 11:22:14 2015 +0000

description:
smp_tlb_flush_pte(): Avoid run-time check for cpu type/implementation by installing correct function pointer in sparc64_ip_init(). sparc64_send_ipi() is changed to a function pointer as well to avoid 
run-time checks.

diffstat:

 sys/arch/sparc64/include/cpu.h      |   4 +-
 sys/arch/sparc64/sparc64/ipifuncs.c |  48 ++++++++++++++++++------------------
 2 files changed, 26 insertions(+), 26 deletions(-)

diffs (122 lines):

diff -r bcb2e5c9a8c5 -r fca2e2dc7693 sys/arch/sparc64/include/cpu.h
--- a/sys/arch/sparc64/include/cpu.h    Fri Jan 02 23:38:45 2015 +0000
+++ b/sys/arch/sparc64/include/cpu.h    Sat Jan 03 11:22:14 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu.h,v 1.113 2014/09/24 18:32:10 palle Exp $ */
+/*     $NetBSD: cpu.h,v 1.114 2015/01/03 11:22:14 palle Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -287,7 +287,7 @@
 
 void   sparc64_multicast_ipi(sparc64_cpuset_t, ipifunc_t, uint64_t, uint64_t);
 void   sparc64_broadcast_ipi(ipifunc_t, uint64_t, uint64_t);
-void   sparc64_send_ipi(int, ipifunc_t, uint64_t, uint64_t);
+extern void (*sparc64_send_ipi)(int, ipifunc_t, uint64_t, uint64_t);
 
 /*
  * Call an arbitrary C function on another cpu (or all others but ourself)
diff -r bcb2e5c9a8c5 -r fca2e2dc7693 sys/arch/sparc64/sparc64/ipifuncs.c
--- a/sys/arch/sparc64/sparc64/ipifuncs.c       Fri Jan 02 23:38:45 2015 +0000
+++ b/sys/arch/sparc64/sparc64/ipifuncs.c       Sat Jan 03 11:22:14 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ipifuncs.c,v 1.53 2014/11/05 13:30:11 nakayama Exp $ */
+/*     $NetBSD: ipifuncs.c,v 1.54 2015/01/03 11:22:14 palle Exp $ */
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.53 2014/11/05 13:30:11 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.54 2015/01/03 11:22:14 palle Exp $");
 
 #include "opt_ddb.h"
 
@@ -68,6 +68,7 @@
 /* Send IPI functions for supported platforms */
 static void    sparc64_send_ipi_sun4u(int, ipifunc_t, uint64_t, uint64_t);
 static void    sparc64_send_ipi_sun4v(int, ipifunc_t, uint64_t, uint64_t);
+void           (*sparc64_send_ipi)(int, ipifunc_t, uint64_t, uint64_t) = NULL;
  
 /*
  * These are the "function" entry points in locore.s/mp_subr.s to handle IPI's.
@@ -83,6 +84,9 @@
 void   sparc64_ipi_blast_dcache(void *, void *);
 void   sparc64_ipi_ccall(void *, void *);
 
+/* Function pointer for use in smp_tlb_flush() - setup in sparc64_ipi_init() */
+static ipifunc_t smp_tlb_flush_pte_func = NULL;
+
 /*
  * Process cpu stop-self event.
  */
@@ -171,6 +175,23 @@
        CPUSET_CLEAR(cpus_spinning);
        CPUSET_CLEAR(cpus_paused);
        CPUSET_CLEAR(cpus_resumed);
+
+       /*
+        * Prepare cpu type dependent function pointers
+        */
+
+       if (CPU_ISSUN4V)
+               smp_tlb_flush_pte_func = sparc64_ipi_flush_pte_sun4v;
+       else if (CPU_IS_USIII_UP())
+               smp_tlb_flush_pte_func = sparc64_ipi_flush_pte_usiii;
+       else
+               smp_tlb_flush_pte_func = sparc64_ipi_flush_pte_us;
+
+       if (CPU_ISSUN4V)
+               sparc64_send_ipi = sparc64_send_ipi_sun4v;
+       else
+               sparc64_send_ipi = sparc64_send_ipi_sun4u;
+
 }
 
 /*
@@ -206,19 +227,6 @@
 }
 
 /*
- * Send an interprocessor interrupt.
- */
-void
-sparc64_send_ipi(int upaid, ipifunc_t func, uint64_t arg1, uint64_t arg2)
-{
-       if (CPU_ISSUN4V)
-               sparc64_send_ipi_sun4v(upaid, func, arg1, arg2);
-       else
-               sparc64_send_ipi_sun4u(upaid, func, arg1, arg2);
-                   
-}
-
-/*
  * Send an interprocessor interrupt - sun4v.
  */
 void
@@ -438,14 +446,6 @@
        struct cpu_info *ci;
        int ctx;
        bool kpm = (pm == pmap_kernel());
-       ipifunc_t func;
-       if (CPU_ISSUN4V)
-               func = sparc64_ipi_flush_pte_sun4v;
-       else if (CPU_IS_USIII_UP())
-               func = sparc64_ipi_flush_pte_usiii;
-       else
-               func = sparc64_ipi_flush_pte_us;
-
        /* Flush our own TLB */
        ctx = pm->pm_ctx[cpu_number()];
        KASSERT(ctx >= 0);
@@ -465,7 +465,7 @@
                        KASSERT(ctx >= 0);
                        if (!kpm && ctx == 0)
                                continue;
-                       sparc64_send_ipi(ci->ci_cpuid, func, va, ctx);
+                       sparc64_send_ipi(ci->ci_cpuid, smp_tlb_flush_pte_func, va, ctx);
                }
        }
 }



Home | Main Index | Thread Index | Old Index