Module Name: src Committed By: rmind Date: Sun Jan 18 23:16:35 UTC 2015
Modified Files: src/sys/kern: subr_ipi.c src/sys/sys: ipi.h Log Message: Implement ipi_trigger_multi(9); requested by cherry@. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/kern/subr_ipi.c cvs rdiff -u -r1.2 -r1.3 src/sys/sys/ipi.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_ipi.c diff -u src/sys/kern/subr_ipi.c:1.2 src/sys/kern/subr_ipi.c:1.3 --- src/sys/kern/subr_ipi.c:1.2 Sun May 25 15:34:19 2014 +++ src/sys/kern/subr_ipi.c Sun Jan 18 23:16:35 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_ipi.c,v 1.2 2014/05/25 15:34:19 rmind Exp $ */ +/* $NetBSD: subr_ipi.c,v 1.3 2015/01/18 23:16:35 rmind Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.2 2014/05/25 15:34:19 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.3 2015/01/18 23:16:35 rmind Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -45,6 +45,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v #include <sys/evcnt.h> #include <sys/cpu.h> #include <sys/ipi.h> +#include <sys/intr.h> #include <sys/kcpuset.h> #include <sys/kmem.h> #include <sys/lock.h> @@ -188,6 +189,35 @@ ipi_trigger(u_int ipi_id, struct cpu_inf } /* + * ipi_trigger_multi: same as ipi_trigger() but sends to the multiple + * CPUs given the target CPU set. + */ +void +ipi_trigger_multi(u_int ipi_id, const kcpuset_t *target) +{ + const cpuid_t selfid = cpu_index(curcpu()); + CPU_INFO_ITERATOR cii; + struct cpu_info *ci; + + KASSERT(kpreempt_disabled()); + KASSERT(target != NULL); + + for (CPU_INFO_FOREACH(cii, ci)) { + const cpuid_t cpuid = cpu_index(ci); + + if (!kcpuset_isset(target, cpuid) || cpuid == selfid) { + continue; + } + ipi_trigger(ipi_id, ci); + } + if (kcpuset_isset(target, selfid)) { + int s = splhigh(); + ipi_cpu_handler(); + splx(s); + } +} + +/* * put_msg: insert message into the mailbox. */ static inline void Index: src/sys/sys/ipi.h diff -u src/sys/sys/ipi.h:1.2 src/sys/sys/ipi.h:1.3 --- src/sys/sys/ipi.h:1.2 Sun May 25 15:34:19 2014 +++ src/sys/sys/ipi.h Sun Jan 18 23:16:35 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ipi.h,v 1.2 2014/05/25 15:34:19 rmind Exp $ */ +/* $NetBSD: ipi.h,v 1.3 2015/01/18 23:16:35 rmind Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -67,6 +67,7 @@ void cpu_ipi(struct cpu_info *); u_int ipi_register(ipi_func_t, void *); void ipi_unregister(u_int); void ipi_trigger(u_int, struct cpu_info *); +void ipi_trigger_multi(u_int, const kcpuset_t *); /* Public interface: synchronous IPIs. */ void ipi_unicast(ipi_msg_t *, struct cpu_info *);