Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Dec 2007 04:32:17 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 131454 for review
Message-ID:  <200712230432.lBN4WHuH089635@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=131454

Change 131454 by jb@jb_freebsd1 on 2007/12/23 04:32:07

	Fix the test-and-set. The return type is inverted. Oops.
	
	Enable the mp_init() function so that it can be called via a 
	SYSINIT at the end of SI_SUB_SMP after the APs are launched. This
	case occurs if the cyclic module is loaded from the boot loader,
	in which case it initialises itself as early as possible to support
	tracing what happens on cpu0, in proc0 and thread0.

Affected files ...

.. //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/os/cyclic.c#8 edit

Differences ...

==== //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/os/cyclic.c#8 (text) ====

@@ -610,7 +610,11 @@
 			break;
 
 		if (cyc_coverage[ndx].cyv_why != NULL ||
-		    casptr(&cyc_coverage[ndx].cyv_why, NULL, why) != 0) {
+#if defined(sun)
+		    casptr(&cyc_coverage[ndx].cyv_why, NULL, why) != NULL) {
+#else
+		    atomic_cmpset_ptr((volatile uintptr_t *) &cyc_coverage[ndx].cyv_why, (uintptr_t) NULL, (uintptr_t) why) == 0) {
+#endif
 
 			if (++ndx == CY_NCOVERAGE)
 				ndx = 0;
@@ -2866,7 +2870,11 @@
 	return (cyclic_resolution);
 }
 
+#if defined(sun)
 void
+#else
+static void
+#endif
 cyclic_init(cyc_backend_t *be, hrtime_t resolution)
 {
 	ASSERT(MUTEX_HELD(&cpu_lock));
@@ -2900,8 +2908,12 @@
  * find the already initialized CPU, and initialize every other CPU with the
  * same backend.  Finally, we register a cpu_setup function.
  */
+#if defined(sun)
 void
-cyclic_mp_init()
+#else
+static void
+#endif
+cyclic_mp_init(void)
 {
 	cpu_t *c;
 #if !defined(sun)
@@ -2926,13 +2938,11 @@
 		}
 #if defined(sun)
 	} while ((c = c->cpu_next) != cpu_list);
+
+	register_cpu_setup_func((cpu_setup_func_t *)cyclic_cpu_setup, NULL);
 #else
 	}
 #endif
-
-#if defined(sun)
-	register_cpu_setup_func((cpu_setup_func_t *)cyclic_cpu_setup, NULL);
-#endif
 	mutex_exit(&cpu_lock);
 }
 
@@ -2948,7 +2958,10 @@
 		if ((pc = pcpu_find(id)) == NULL)
 			continue;
 
-		c = &cyclic_cpu[pc->pc_cpuid];
+		c = &cyclic_cpu[id];
+
+		if (c->cpu_cyclic == NULL)
+			continue;
 
 		cyclic_offline(c);
 		cyclic_unconfigure(c);
@@ -3115,7 +3128,9 @@
 	cyc_id_t *idp;
 
 	CYC_PTRACE1("online", cpu);
+#if defined(sun)
 	ASSERT(c->cpu_flags & CPU_ENABLE);
+#endif
 	ASSERT(MUTEX_HELD(&cpu_lock));
 	ASSERT(cpu->cyp_state == CYS_OFFLINE);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712230432.lBN4WHuH089635>