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/32a8118fb445
branches:  trunk
changeset: 796227:32a8118fb445
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 e82be32301e1 -r 32a8118fb445 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 e82be32301e1 -r 32a8118fb445 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 e82be32301e1 -r 32a8118fb445 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 e82be32301e1 -r 32a8118fb445 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