diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/mips64/mips64/ipifuncs.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/arch/mips64/mips64/ipifuncs.c b/sys/arch/mips64/mips64/ipifuncs.c index 0a1d28281dc..f5a04f7b0a5 100644 --- a/sys/arch/mips64/mips64/ipifuncs.c +++ b/sys/arch/mips64/mips64/ipifuncs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ipifuncs.c,v 1.12 2016/01/08 05:26:25 visa Exp $ */ +/* $OpenBSD: ipifuncs.c,v 1.13 2017/02/19 08:35:13 visa Exp $ */ /* $NetBSD: ipifuncs.c,v 1.40 2008/04/28 20:23:10 martin Exp $ */ /*- @@ -47,6 +47,9 @@ void mips64_ipi_nop(void); void smp_rendezvous_action(void); void mips64_ipi_ddb(void); void mips64_multicast_ipi(unsigned int, unsigned int); + +struct evcount ipi_count; +unsigned int ipi_irq = 0; unsigned int ipi_mailbox[MAXCPUS]; /* Variables needed for SMP rendezvous. */ @@ -77,8 +80,10 @@ mips64_ipi_init(void) cpuid_t cpuid = cpu_number(); int error; - if (!cpuid) + if (!cpuid) { mtx_init(&smp_ipi_mtx, IPL_IPI); + evcount_attach(&ipi_count, "ipi", &ipi_irq); + } hw_ipi_intr_clear(cpuid); @@ -104,9 +109,13 @@ mips64_ipi_intr(void *arg) pending_ipis = atomic_swap_uint(&ipi_mailbox[cpuid], 0); if (pending_ipis > 0) { - for (bit = 0; bit < MIPS64_NIPIS; bit++) - if (pending_ipis & (1UL << bit)) + for (bit = 0; bit < MIPS64_NIPIS; bit++) { + if (pending_ipis & (1UL << bit)) { (*ipifuncs[bit])(); + atomic_inc_long( + (unsigned long *)&ipi_count.ec_count); + } + } } return 1; |