Module Name:    src
Committed By:   jmcneill
Date:           Mon Jul 20 14:19:41 UTC 2020

Modified Files:
        src/sys/arch/mips/mips: cpu_subr.c

Log Message:
Serialize CPU hatch annoucement printfs and wait for CPUs to start before
returning from cpu_boot_secondary_processors.


To generate a diff of this commit:
cvs rdiff -u -r1.52 -r1.53 src/sys/arch/mips/mips/cpu_subr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/mips/cpu_subr.c
diff -u src/sys/arch/mips/mips/cpu_subr.c:1.52 src/sys/arch/mips/mips/cpu_subr.c:1.53
--- src/sys/arch/mips/mips/cpu_subr.c:1.52	Mon Jul 20 10:53:47 2020
+++ src/sys/arch/mips/mips/cpu_subr.c	Mon Jul 20 14:19:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.52 2020/07/20 10:53:47 skrll Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.53 2020/07/20 14:19:41 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2010, 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.52 2020/07/20 10:53:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.53 2020/07/20 14:19:41 jmcneill Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -75,6 +75,8 @@ __KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v
 extern struct cpu_softc octeon_cpu_softc[];
 #endif
 
+static kmutex_t cpu_hatch_lock;
+
 struct cpu_info cpu_info_store
 #if defined(MULTIPROCESSOR) && !defined(MIPS64_OCTEON)
 	__section(".data1")
@@ -949,7 +951,9 @@ cpu_hatch(struct cpu_info *ci)
 	 * Let this CPU do its own post-running initialization
 	 * (for things that have to be done on the local CPU).
 	 */
+	mutex_enter(&cpu_hatch_lock);
 	(*mips_locoresw.lsw_cpu_run)(ci);
+	mutex_exit(&cpu_hatch_lock);
 
 	/*
 	 * Now turn on interrupts (and verify they are on).
@@ -973,6 +977,8 @@ cpu_boot_secondary_processors(void)
 	CPU_INFO_ITERATOR cii;
 	struct cpu_info *ci;
 
+	mutex_init(&cpu_hatch_lock, MUTEX_DEFAULT, IPL_HIGH);
+
 	for (CPU_INFO_FOREACH(cii, ci)) {
 		if (CPU_IS_PRIMARY(ci))
 			continue;
@@ -988,8 +994,8 @@ cpu_boot_secondary_processors(void)
 		atomic_or_ulong(&ci->ci_flags, CPUF_RUNNING);
 		kcpuset_set(cpus_running, cpu_index(ci));
 		// Spin until the cpu calls idle_loop
-		for (u_int i = 0; i < 100; i++) {
-			if (kcpuset_isset(cpus_running, cpu_index(ci)))
+		for (u_int i = 0; i < 10000; i++) {
+			if (kcpuset_isset(kcpuset_running, cpu_index(ci)))
 				break;
 			delay(1000);
 		}

Reply via email to