Module Name: src
Committed By: palle
Date: Sat Jan 3 11:22:14 UTC 2015
Modified Files:
src/sys/arch/sparc64/include: cpu.h
src/sys/arch/sparc64/sparc64: ipifuncs.c
Log Message:
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.
To generate a diff of this commit:
cvs rdiff -u -r1.113 -r1.114 src/sys/arch/sparc64/include/cpu.h
cvs rdiff -u -r1.53 -r1.54 src/sys/arch/sparc64/sparc64/ipifuncs.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/include/cpu.h
diff -u src/sys/arch/sparc64/include/cpu.h:1.113 src/sys/arch/sparc64/include/cpu.h:1.114
--- src/sys/arch/sparc64/include/cpu.h:1.113 Wed Sep 24 18:32:10 2014
+++ src/sys/arch/sparc64/include/cpu.h Sat Jan 3 11:22:14 2015
@@ -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 @@ typedef void (* ipifunc_t)(void *, void
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)
Index: src/sys/arch/sparc64/sparc64/ipifuncs.c
diff -u src/sys/arch/sparc64/sparc64/ipifuncs.c:1.53 src/sys/arch/sparc64/sparc64/ipifuncs.c:1.54
--- src/sys/arch/sparc64/sparc64/ipifuncs.c:1.53 Wed Nov 5 13:30:11 2014
+++ src/sys/arch/sparc64/sparc64/ipifuncs.c Sat Jan 3 11:22:14 2015
@@ -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 @@ static void sparc64_ipi_error(const char
/* 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_dcache_flush_page_sun4v
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 @@ sparc64_ipi_init(void)
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 @@ sparc64_broadcast_ipi(ipifunc_t func, ui
}
/*
- * 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 @@ smp_tlb_flush_pte(vaddr_t va, struct pma
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 @@ smp_tlb_flush_pte(vaddr_t va, struct pma
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);
}
}
}