Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src MI IPI interface:
details: https://anonhg.NetBSD.org/src/rev/044d797bc731
branches: trunk
changeset: 329466:044d797bc731
user: rmind <rmind%NetBSD.org@localhost>
date: Sun May 25 15:34:19 2014 +0000
description:
MI IPI interface:
- Implement support for the asynchronous IPI calls.
- Rework synchronous IPI code to reuse the asynchronous mechanism.
- Add ipi(9) manual page; needs wizd(8).
Note: MD code can now provide a low level primitive for the ipi(9) and
reuse this interface instead of open-coding. Portmasters are encouraged
to convert. Ride 6.99.43!
diffstat:
distrib/sets/lists/comp/mi | 5 +-
share/man/man9/Makefile | 4 +-
share/man/man9/ipi.9 | 177 +++++++++++++++++++++++++++++++++++++++++++++
sys/kern/subr_ipi.c | 158 +++++++++++++++++++++++++++++++++++++--
sys/sys/cpu_data.h | 5 +-
sys/sys/ipi.h | 23 ++++-
6 files changed, 355 insertions(+), 17 deletions(-)
diffs (truncated from 548 to 300 lines):
diff -r 68048ddbe12e -r 044d797bc731 distrib/sets/lists/comp/mi
--- a/distrib/sets/lists/comp/mi Sun May 25 14:56:46 2014 +0000
+++ b/distrib/sets/lists/comp/mi Sun May 25 15:34:19 2014 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1892 2014/05/15 16:32:28 apb Exp $
+# $NetBSD: mi,v 1.1893 2014/05/25 15:34:19 rmind Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -10273,6 +10273,7 @@
./usr/share/man/cat9/ioctl.0 comp-sys-catman .cat
./usr/share/man/cat9/ioctl_copyin.0 comp-sys-catman .cat
./usr/share/man/cat9/ioctl_copyout.0 comp-sys-catman .cat
+./usr/share/man/cat9/ipi.0 comp-sys-catman .cat
./usr/share/man/cat9/ipkdb.0 comp-sys-catman .cat
./usr/share/man/cat9/ipkdb_connect.0 comp-sys-catman .cat
./usr/share/man/cat9/ipkdb_init.0 comp-sys-catman .cat
@@ -16970,6 +16971,7 @@
./usr/share/man/html9/ioctl.html comp-sys-htmlman html
./usr/share/man/html9/ioctl_copyin.html comp-sys-htmlman html
./usr/share/man/html9/ioctl_copyout.html comp-sys-htmlman html
+./usr/share/man/html9/ipi.html comp-sys-htmlman html
./usr/share/man/html9/ipkdb.html comp-sys-htmlman html
./usr/share/man/html9/ipkdb_connect.html comp-sys-htmlman html
./usr/share/man/html9/ipkdb_init.html comp-sys-htmlman html
@@ -23820,6 +23822,7 @@
./usr/share/man/man9/ioctl.9 comp-sys-man .man
./usr/share/man/man9/ioctl_copyin.9 comp-sys-man .man
./usr/share/man/man9/ioctl_copyout.9 comp-sys-man .man
+./usr/share/man/man9/ipi.9 comp-sys-man .man
./usr/share/man/man9/ipkdb.9 comp-sys-man .man
./usr/share/man/man9/ipkdb_connect.9 comp-sys-man .man
./usr/share/man/man9/ipkdb_init.9 comp-sys-man .man
diff -r 68048ddbe12e -r 044d797bc731 share/man/man9/Makefile
--- a/share/man/man9/Makefile Sun May 25 14:56:46 2014 +0000
+++ b/share/man/man9/Makefile Sun May 25 15:34:19 2014 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.377 2014/03/24 13:42:40 hannken Exp $
+# $NetBSD: Makefile,v 1.378 2014/05/25 15:34:20 rmind Exp $
# Makefile for section 9 (kernel function and variable) manual pages.
@@ -25,7 +25,7 @@
ieee80211_node.9 ieee80211_output.9 ieee80211_proto.9 \
ieee80211_radiotap.9 iic.9 imax.9 \
in_getifa.9 \
- in4_cksum.9 inittodr.9 intro.9 ioasic.9 ioctl.9 ipkdb.9 isa.9 \
+ in4_cksum.9 inittodr.9 intro.9 ioasic.9 ioctl.9 ipkdb.9 ipi.9 isa.9 \
isapnp.9 itimerfix.9 kauth.9 kcopy.9 kcpuset.9 kmem.9 \
kpause.9 \
kfilter_register.9 knote.9 \
diff -r 68048ddbe12e -r 044d797bc731 share/man/man9/ipi.9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/man/man9/ipi.9 Sun May 25 15:34:19 2014 +0000
@@ -0,0 +1,177 @@
+.\" $NetBSD: ipi.9,v 1.1 2014/05/25 15:34:20 rmind Exp $
+.\"
+.\" Copyright (c) 2014 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Mindaugas Rasiukevicius.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd May 25, 2014
+.Dt IPI 9
+.Os
+.Sh NAME
+.Nm ipi
+.Nd MI IPI interface
+.Sh SYNOPSIS
+.In sys/ipi.h
+.Vt typedef void (*ipi_func_t)(void *);
+.\" -----
+.Ft u_int
+.Fn ipi_register "ipi_func_t func" "void *arg"
+.Ft void
+.Fn ipi_unregister "u_int ipi_id"
+.Ft void
+.Fn ipi_trigger "u_int ipi_id" "struct cpu_info *ci"
+.\" -----
+.Ft void
+.Fn ipi_unicast "ipi_msg_t *msg" "struct cpu_info *ci"
+.Ft void
+.Fn ipi_multicast "ipi_msg_t *msg" "const kcpuset_t *target"
+.Ft void
+.Fn ipi_broadcast "ipi_msg_t *msg"
+.Ft void
+.Fn ipi_wait "ipi_msg_t *msg"
+.\" -----
+.Sh DESCRIPTION
+The machine-independent
+.Nm
+interface provides capability to send inter-processor interrupts (IPIs)
+amongst CPUs.
+The interface has two mechanisms: asynchronous IPI to invoke functions
+with a constant argument and synchronous IPIs with the cross-call support.
+.Pp
+Other synchronization interfaces are built using the MI IPI interface.
+For a general purpose inter-processor cross-calls or remote interrupts, use
+.Xr xcall 9
+or
+.Xr softint 9
+interfaces.
+.Pp
+The primary use cases of the MI IPIs include the following:
+.Bl -hyphen -compact
+.It
+provide a facility for
+.Xr softint 9
+subsystem to schedule software interrupts on the remote CPUs
+.It
+provide a facility for
+.Xr xcall 9
+subsystem
+.It
+abstract IPI handling and facilitate the machine-dependent code
+.El
+.Pp
+.\" -----
+.Ss Asynchronous IPI interface
+This interface allows dynamic registration of IPI handlers with a constant
+argument and asynchronous triggering of the interrupts.
+.Bl -tag -width compact
+.It Fn ipi_register "func" "arg"
+Register an IPI handler
+.Fa func
+with an arbitrary argument
+.Fa arg .
+Returns non-zero IPI identifier on success and zero on failure.
+.It Fn ipi_unregister "ipi_id"
+Unregister the IPI handler identified by the
+.Fa ipi_id .
+.It Fn ipi_trigger "ipi_id" "ci"
+Trigger an IPI identified by
+.Fa ipi_id
+on a remote CPU specified by
+.Fa ci .
+This function must be called with the kernel preemption disabled and
+the target CPU must be remote.
+.El
+.Pp
+.\" -----
+.Ss Synchronous IPI interface
+This interface provides capability to perform cross-calls, i.e. invoke
+an arbitrary function on a remote CPU.
+The invocations are performed synchronously and the caller must wait
+for completion.
+The cross-call is described by an IPI "message".
+The caller has to fill
+.Vt ipi_msg_t
+structure which has the following public members:
+.Bd -literal
+ ipi_func_t func;
+ void arg;
+.Ed
+.Pp
+The
+.Ar func
+member specifies a function to invoke and
+.Ar arg
+is the argument to be passed to the function.
+.Pp
+.Bl -tag -width compact
+.It Fn ipi_unicast "msg" "ci"
+Send an IPI to a remote CPU specified by
+.Fa ci .
+.It Fn ipi_multicast "msg" "target"
+Send IPIs to a CPU set specified by the
+.Fa target .
+.It Fn ipi_broadcast "msg"
+Send IPIs to all CPUs.
+.It Fn ipi_wait "msg"
+Wait until all IPIs complete.
+.El
+.Pp
+All described functions, except
+.Fn ipi_wait ,
+must be called with the kernel preemption disabled.
+All synchronous IPI invocations must be awaited for completion with
+.Fn ipi_wait
+function, before IPI message structure can be destroyed or new
+cross-call requests performed.
+.\" -----
+.Sh NOTES
+Functions being called must be lightweight.
+They run at
+.Em IPL_HIGH
+and should generally not use any other synchronization interfaces,
+such as
+.Xr mutex 9 .
+If spin-locks are used, they must be used carefully and have no contention.
+.\" -----
+.Sh CODE REFERENCES
+The
+.Nm
+interface is implemented within the file
+.Pa sys/kern/subr_ipi.c .
+.\" -----
+.Sh SEE ALSO
+.Xr softint 9 ,
+.Xr spl 9 ,
+.Xr kcpuset 9 ,
+.Xr kpreempt 9 ,
+.Xr xcall 9
+.Sh HISTORY
+The
+.Nm
+interface first appeared in
+.Nx 7.0 .
+.Sh AUTHORS
+.An Mindaugas Rasiukevicius Aq Mt rmind%NetBSD.org@localhost
diff -r 68048ddbe12e -r 044d797bc731 sys/kern/subr_ipi.c
--- a/sys/kern/subr_ipi.c Sun May 25 14:56:46 2014 +0000
+++ b/sys/kern/subr_ipi.c Sun May 25 15:34:19 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_ipi.c,v 1.1 2014/05/19 22:47:54 rmind Exp $ */
+/* $NetBSD: subr_ipi.c,v 1.2 2014/05/25 15:34:19 rmind Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,11 +30,13 @@
*/
/*
- * Inter-processor interrupt (IPI) interface with cross-call support.
+ * Inter-processor interrupt (IPI) interface: asynchronous IPIs to
+ * invoke functions with a constant argument and synchronous IPIs
+ * with the cross-call support.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.1 2014/05/19 22:47:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.2 2014/05/25 15:34:19 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -46,10 +48,25 @@
#include <sys/kcpuset.h>
#include <sys/kmem.h>
#include <sys/lock.h>
+#include <sys/mutex.h>
+
+/*
+ * An array of the IPI handlers used for asynchronous invocation.
+ * The lock protects the slot allocation.
+ */
+
+typedef struct {
+ ipi_func_t func;
+ void * arg;
+} ipi_intr_t;
+
+static kmutex_t ipi_mngmt_lock;
+static ipi_intr_t ipi_intrs[IPI_MAXREG] __cacheline_aligned;
/*
* Per-CPU mailbox for IPI messages: it is a single cache line storing
- * up to IPI_MSG_MAX messages.
+ * up to IPI_MSG_MAX messages. This interface is built on top of the
+ * synchronous IPIs.
*/
#define IPI_MSG_SLOTS (CACHE_LINE_SIZE / sizeof(ipi_msg_t *))
@@ -59,8 +76,14 @@
ipi_msg_t * msg[IPI_MSG_SLOTS];
} ipi_mbox_t;
+
+/* Mailboxes for the synchronous IPIs. */
static ipi_mbox_t * ipi_mboxes __read_mostly;
static struct evcnt ipi_mboxfull_ev __cacheline_aligned;
+static void ipi_msg_cpu_handler(void *);
+
+/* Handler for the synchronous IPIs - it must be zero. */
+#define IPI_SYNCH_ID 0
#ifndef MULTIPROCESSOR
#define cpu_ipi(ci) KASSERT(ci == NULL)
@@ -71,15 +94,100 @@
Home |
Main Index |
Thread Index |
Old Index