diff --git a/sys/arm/arm/mp_machdep.c b/sys/arm/arm/mp_machdep.c --- a/sys/arm/arm/mp_machdep.c +++ b/sys/arm/arm/mp_machdep.c @@ -223,22 +223,24 @@ /* NOTREACHED */ } -static void +static int ipi_rendezvous(void *dummy __unused) { CTR0(KTR_SMP, "IPI_RENDEZVOUS"); smp_rendezvous_action(); + return (FILTER_HANDLED); } -static void +static int ipi_ast(void *dummy __unused) { CTR0(KTR_SMP, "IPI_AST"); + return (FILTER_HANDLED); } -static void +static int ipi_stop(void *dummy __unused) { u_int cpu; @@ -277,22 +279,25 @@ dbg_resume_dbreg(); #endif CTR0(KTR_SMP, "IPI_STOP (restart)"); + return (FILTER_HANDLED); } -static void +static int ipi_preempt(void *arg) { CTR1(KTR_SMP, "%s: IPI_PREEMPT", __func__); sched_preempt(curthread); + return (FILTER_HANDLED); } -static void +static int ipi_hardclock(void *arg) { CTR1(KTR_SMP, "%s: IPI_HARDCLOCK", __func__); hardclockintr(); + return (FILTER_HANDLED); } static void diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c --- a/sys/arm64/arm64/mp_machdep.c +++ b/sys/arm64/arm64/mp_machdep.c @@ -99,11 +99,11 @@ }; #endif -static void ipi_ast(void *); -static void ipi_hardclock(void *); -static void ipi_preempt(void *); -static void ipi_rendezvous(void *); -static void ipi_stop(void *); +static int ipi_ast(void *); +static int ipi_hardclock(void *); +static int ipi_preempt(void *); +static int ipi_rendezvous(void *); +static int ipi_stop(void *); struct pcb stoppcbs[MAXCPU]; @@ -304,37 +304,42 @@ SYSINIT(smp_after_idle_runnable, SI_SUB_SMP, SI_ORDER_ANY, smp_after_idle_runnable, NULL); -static void +static int ipi_ast(void *dummy __unused) { CTR0(KTR_SMP, "IPI_AST"); + return (FILTER_HANDLED); } -static void +static int ipi_hardclock(void *dummy __unused) { CTR1(KTR_SMP, "%s: IPI_HARDCLOCK", __func__); hardclockintr(); + return (FILTER_HANDLED); } -static void +static int ipi_preempt(void *dummy __unused) { + CTR1(KTR_SMP, "%s: IPI_PREEMPT", __func__); sched_preempt(curthread); + return (FILTER_HANDLED); } -static void +static int ipi_rendezvous(void *dummy __unused) { CTR0(KTR_SMP, "IPI_RENDEZVOUS"); smp_rendezvous_action(); + return (FILTER_HANDLED); } -static void +static int ipi_stop(void *dummy __unused) { u_int cpu; @@ -358,6 +363,7 @@ CPU_CLR_ATOMIC(cpu, &started_cpus); CPU_CLR_ATOMIC(cpu, &stopped_cpus); CTR0(KTR_SMP, "IPI_STOP (restart)"); + return (FILTER_HANDLED); } struct cpu_group * diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c --- a/sys/kern/subr_intr.c +++ b/sys/kern/subr_intr.c @@ -1770,7 +1770,7 @@ PIC_IPI_SEND(intr_irq_root_dev, ii->ii_isrc, cpus, ipi); } -void +int intr_ipi_dispatch(u_int ipi) { struct intr_ipi *ii; @@ -1781,7 +1781,7 @@ intr_ipi_increment_count(ii->ii_count, PCPU_GET(cpuid)); - ii->ii_handler(ii->ii_handler_arg); + return (ii->ii_handler(ii->ii_handler_arg) != FILTER_HANDLED); } /* diff --git a/sys/sys/intr.h b/sys/sys/intr.h --- a/sys/sys/intr.h +++ b/sys/sys/intr.h @@ -159,12 +159,12 @@ /* Intr interface for IPIs. */ #ifdef SMP -typedef void intr_ipi_handler_t(void *); +typedef driver_filter_t intr_ipi_handler_t; void intr_ipi_setup(u_int ipi, const char *name, intr_ipi_handler_t *hand, void *arg); void intr_ipi_send(cpuset_t cpus, u_int ipi); -void intr_ipi_dispatch(u_int ipi); +int intr_ipi_dispatch(u_int ipi); #endif #endif /* _SYS_INTR_H */