Do not re-insert the event counter to evcount_list in evcount_percpu(). Otherwise the list becomes corrupt when evcount_percpu() is called after evcount_init_percpu().
OK? As an extra, use percpu counters with mips64 clock and ipi interrupts. Index: kern/subr_evcount.c =================================================================== RCS file: src/sys/kern/subr_evcount.c,v retrieving revision 1.14 diff -u -p -r1.14 subr_evcount.c --- kern/subr_evcount.c 10 Nov 2022 07:05:41 -0000 1.14 +++ kern/subr_evcount.c 4 Dec 2022 14:17:59 -0000 @@ -56,7 +56,6 @@ evcount_percpu(struct evcount *ec) TAILQ_INSERT_TAIL(&evcount_percpu_init_list, ec, next); } else { ec->ec_percpu = counters_alloc(1); - TAILQ_INSERT_TAIL(&evcount_list, ec, next); } } Index: arch/mips64/mips64/clock.c =================================================================== RCS file: src/sys/arch/mips64/mips64/clock.c,v retrieving revision 1.48 diff -u -p -r1.48 clock.c --- arch/mips64/mips64/clock.c 19 Nov 2022 16:23:48 -0000 1.48 +++ arch/mips64/mips64/clock.c 4 Dec 2022 14:17:58 -0000 @@ -37,7 +37,6 @@ #include <sys/param.h> #include <sys/kernel.h> #include <sys/systm.h> -#include <sys/atomic.h> #include <sys/clockintr.h> #include <sys/device.h> #include <sys/evcount.h> @@ -100,6 +99,7 @@ clockattach(struct device *parent, struc */ set_intr(INTPRI_CLOCK, CR_INT_5, cp0_int5); evcount_attach(&cp0_clock_count, "clock", &cp0_clock_irq); + evcount_percpu(&cp0_clock_count); /* try to avoid getting clock interrupts early */ cp0_set_compare(cp0_get_count() - 1); @@ -121,7 +121,7 @@ cp0_int5(uint32_t mask, struct trapframe struct cpu_info *ci = curcpu(); int s; - atomic_inc_long((unsigned long *)&cp0_clock_count.ec_count); + evcount_inc(&cp0_clock_count); cp0_set_compare(cp0_get_count() - 1); /* clear INT5 */ Index: arch/mips64/mips64/ipifuncs.c =================================================================== RCS file: src/sys/arch/mips64/mips64/ipifuncs.c,v retrieving revision 1.25 diff -u -p -r1.25 ipifuncs.c --- arch/mips64/mips64/ipifuncs.c 10 Apr 2022 13:23:14 -0000 1.25 +++ arch/mips64/mips64/ipifuncs.c 4 Dec 2022 14:17:58 -0000 @@ -84,6 +84,7 @@ mips64_ipi_init(void) if (!cpuid) { mtx_init(&smp_rv_mtx, IPL_HIGH); evcount_attach(&ipi_count, "ipi", &ipi_irq); + evcount_percpu(&ipi_count); } hw_ipi_intr_clear(cpuid); @@ -113,8 +114,7 @@ mips64_ipi_intr(void *arg) for (bit = 0; bit < MIPS64_NIPIS; bit++) { if (pending_ipis & (1UL << bit)) { (*ipifuncs[bit])(); - atomic_inc_long( - (unsigned long *)&ipi_count.ec_count); + evcount_inc(&ipi_count); } } }