kernel - Use atomic op for usched_global_cpumask
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 11 Oct 2012 06:43:03 +0000 (23:43 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 11 Oct 2012 06:43:03 +0000 (23:43 -0700)
* Use atomic op for usched_global_cpumask in the cpu init code.  This
  code is serialized anyway, I think, but it is best to be safe.

* Add cpu_ccfence() to ensure that the compiler does not reorder the
  clearing of the mask in the cpusync code.

sys/kern/init_main.c
sys/kern/lwkt_ipiq.c

index e6951bb..e26994e 100644 (file)
@@ -719,6 +719,6 @@ mi_gdinit(struct globaldata *gd, int cpuid)
        lwkt_gdinit(gd);
        vm_map_entry_reserve_cpu_init(gd);
        sleep_gdinit(gd);
-       usched_global_cpumask |= CPUMASK(cpuid);
+       atomic_set_cpumask(&usched_global_cpumask, CPUMASK(cpuid));
 }
 
index a7c31bc..e8b326e 100644 (file)
@@ -821,6 +821,7 @@ lwkt_cpusync_deinterlock(lwkt_cpusync_t cs)
     mask = cs->cs_mack;
     cpu_ccfence();
     cs->cs_mack = 0;
+    cpu_ccfence();
     if (cs->cs_func && (cs->cs_mask & gd->gd_cpumask))
            cs->cs_func(cs->cs_data);
     if (mask) {