svn commit: r221679 - in user/avg/xcpu/sys: amd64/amd64 kern sys

Andriy Gapon avg at FreeBSD.org
Mon May 9 07:06:35 UTC 2011


Author: avg
Date: Mon May  9 07:06:34 2011
New Revision: 221679
URL: http://svn.freebsd.org/changeset/base/221679

Log:
  simplify the way of execution of reset on BSP
  
  instead of restarting the BSP and having a special restart hook,
  the hook is placed in the spin loop and it is triggered simply
  by setting hook function to non-NULL

Modified:
  user/avg/xcpu/sys/amd64/amd64/mp_machdep.c
  user/avg/xcpu/sys/amd64/amd64/vm_machdep.c
  user/avg/xcpu/sys/kern/subr_smp.c
  user/avg/xcpu/sys/sys/smp.h

Modified: user/avg/xcpu/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- user/avg/xcpu/sys/amd64/amd64/mp_machdep.c	Mon May  9 07:05:36 2011	(r221678)
+++ user/avg/xcpu/sys/amd64/amd64/mp_machdep.c	Mon May  9 07:06:34 2011	(r221679)
@@ -1435,16 +1435,17 @@ cpustop_handler(void)
 	atomic_set_int(&stopped_cpus, cpumask);
 
 	/* Wait for restart */
-	while (!(started_cpus & cpumask))
-	    ia32_pause();
+	while ((started_cpus & cpumask) == 0) {
+		if (cpu == 0 && cpustop_hook != NULL) {
+			cpustop_hook();
+			cpustop_hook = NULL;
+		}
+		ia32_pause();
+	}
 
 	atomic_clear_int(&started_cpus, cpumask);
 	atomic_clear_int(&stopped_cpus, cpumask);
-
-	if (cpu == 0 && cpustop_restartfunc != NULL) {
-		cpustop_restartfunc();
-		cpustop_restartfunc = NULL;
-	}
+	return;
 }
 
 /*

Modified: user/avg/xcpu/sys/amd64/amd64/vm_machdep.c
==============================================================================
--- user/avg/xcpu/sys/amd64/amd64/vm_machdep.c	Mon May  9 07:05:36 2011	(r221678)
+++ user/avg/xcpu/sys/amd64/amd64/vm_machdep.c	Mon May  9 07:06:34 2011	(r221679)
@@ -541,12 +541,11 @@ cpu_reset()
 		}
 		if (PCPU_GET(cpuid) != 0) {
 			cpu_reset_proxyid = PCPU_GET(cpuid);
-			cpustop_restartfunc = cpu_reset_proxy;
 			cpu_reset_proxy_active = 0;
 			printf("cpu_reset: Restarting BSP\n");
 
 			/* Restart CPU #0. */
-			atomic_store_rel_int(&started_cpus, 1 << 0);
+			cpustop_hook = cpu_reset_proxy;
 
 			cnt = 0;
 			while (cpu_reset_proxy_active == 0 && cnt < 10000000)

Modified: user/avg/xcpu/sys/kern/subr_smp.c
==============================================================================
--- user/avg/xcpu/sys/kern/subr_smp.c	Mon May  9 07:05:36 2011	(r221678)
+++ user/avg/xcpu/sys/kern/subr_smp.c	Mon May  9 07:06:34 2011	(r221679)
@@ -63,7 +63,7 @@ cpumask_t idle_cpus_mask;
 cpumask_t hlt_cpus_mask;
 cpumask_t logical_cpus_mask;
 
-void (*cpustop_restartfunc)(void);
+void (* volatile cpustop_hook)(void);
 #endif
 /* This is used in modules that need to work in both SMP and UP. */
 cpumask_t all_cpus;

Modified: user/avg/xcpu/sys/sys/smp.h
==============================================================================
--- user/avg/xcpu/sys/sys/smp.h	Mon May  9 07:05:36 2011	(r221678)
+++ user/avg/xcpu/sys/sys/smp.h	Mon May  9 07:06:34 2011	(r221679)
@@ -68,7 +68,7 @@ struct cpu_group *smp_topo_2level(int l2
     int l1count, int l1flags);
 struct cpu_group *smp_topo_find(struct cpu_group *top, int cpu);
 
-extern void (*cpustop_restartfunc)(void);
+extern void (* volatile cpustop_hook)(void);
 extern int smp_active;
 extern int smp_cpus;
 extern volatile cpumask_t started_cpus;


More information about the svn-src-user mailing list