Module Name:    src
Committed By:   riastradh
Date:           Tue Sep  8 16:00:35 UTC 2020

Modified Files:
        src/sys/kern: init_main.c subr_ipi.c
        src/sys/sys: ipi.h

Log Message:
ipi: Split up initialization into two parts.

First part runs early so ipi_register can be used in module
initialization, e.g. via pktqueue_create; second part runs after CPUs
have been detected.


To generate a diff of this commit:
cvs rdiff -u -r1.530 -r1.531 src/sys/kern/init_main.c
cvs rdiff -u -r1.7 -r1.8 src/sys/kern/subr_ipi.c
cvs rdiff -u -r1.4 -r1.5 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/init_main.c
diff -u src/sys/kern/init_main.c:1.530 src/sys/kern/init_main.c:1.531
--- src/sys/kern/init_main.c:1.530	Mon Sep  7 03:50:41 2020
+++ src/sys/kern/init_main.c	Tue Sep  8 16:00:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: init_main.c,v 1.530 2020/09/07 03:50:41 thorpej Exp $	*/
+/*	$NetBSD: init_main.c,v 1.531 2020/09/08 16:00:35 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.530 2020/09/07 03:50:41 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.531 2020/09/08 16:00:35 riastradh Exp $");
 
 #include "opt_cnmagic.h"
 #include "opt_ddb.h"
@@ -362,6 +362,9 @@ main(void)
 	 */
 	bpf_setops();
 
+	/* Initialize what we can in ipi(9) before CPUs are detected. */
+	ipi_sysinit();
+
 	/* Start module system. */
 	module_init();
 	module_hook_init();
@@ -546,7 +549,8 @@ main(void)
 
 	configure2();
 
-	ipi_sysinit();
+	/* Initialize the rest of ipi(9) after CPUs have been detected. */
+	ipi_percpu_init();
 
 	futex_sys_init();
 

Index: src/sys/kern/subr_ipi.c
diff -u src/sys/kern/subr_ipi.c:1.7 src/sys/kern/subr_ipi.c:1.8
--- src/sys/kern/subr_ipi.c:1.7	Wed Oct 16 18:29:49 2019
+++ src/sys/kern/subr_ipi.c	Tue Sep  8 16:00:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_ipi.c,v 1.7 2019/10/16 18:29:49 christos Exp $	*/
+/*	$NetBSD: subr_ipi.c,v 1.8 2020/09/08 16:00:35 riastradh 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.7 2019/10/16 18:29:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.8 2020/09/08 16:00:35 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -93,20 +93,10 @@ static void		ipi_msg_cpu_handler(void *)
 void
 ipi_sysinit(void)
 {
-	const size_t len = ncpu * sizeof(ipi_mbox_t);
 
-	/* Initialise the per-CPU bit fields. */
-	for (u_int i = 0; i < ncpu; i++) {
-		struct cpu_info *ci = cpu_lookup(i);
-		memset(&ci->ci_ipipend, 0, sizeof(ci->ci_ipipend));
-	}
 	mutex_init(&ipi_mngmt_lock, MUTEX_DEFAULT, IPL_NONE);
 	memset(ipi_intrs, 0, sizeof(ipi_intrs));
 
-	/* Allocate per-CPU IPI mailboxes. */
-	ipi_mboxes = kmem_zalloc(len, KM_SLEEP);
-	KASSERT(ipi_mboxes != NULL);
-
 	/*
 	 * Register the handler for synchronous IPIs.  This mechanism
 	 * is built on top of the asynchronous interface.  Slot zero is
@@ -119,6 +109,22 @@ ipi_sysinit(void)
 	   "ipi", "full");
 }
 
+void
+ipi_percpu_init(void)
+{
+	const size_t len = ncpu * sizeof(ipi_mbox_t);
+
+	/* Initialise the per-CPU bit fields. */
+	for (u_int i = 0; i < ncpu; i++) {
+		struct cpu_info *ci = cpu_lookup(i);
+		memset(&ci->ci_ipipend, 0, sizeof(ci->ci_ipipend));
+	}
+
+	/* Allocate per-CPU IPI mailboxes. */
+	ipi_mboxes = kmem_zalloc(len, KM_SLEEP);
+	KASSERT(ipi_mboxes != NULL);
+}
+
 /*
  * ipi_register: register an asynchronous IPI handler.
  *

Index: src/sys/sys/ipi.h
diff -u src/sys/sys/ipi.h:1.4 src/sys/sys/ipi.h:1.5
--- src/sys/sys/ipi.h:1.4	Sat Apr  6 02:59:05 2019
+++ src/sys/sys/ipi.h	Tue Sep  8 16:00:35 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipi.h,v 1.4 2019/04/06 02:59:05 thorpej Exp $	*/
+/*	$NetBSD: ipi.h,v 1.5 2020/09/08 16:00:35 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,6 +60,7 @@ typedef struct {
 #define	IPI_BITWORDS	(IPI_MAXREG >> IPI_BITW_SHIFT)
 
 void	ipi_sysinit(void);
+void	ipi_percpu_init(void);
 void	ipi_cpu_handler(void);
 void	cpu_ipi(struct cpu_info *);
 

Reply via email to