From: Matthew Dillon Date: Thu, 11 Oct 2012 06:43:03 +0000 (-0700) Subject: kernel - Use atomic op for usched_global_cpumask X-Git-Tag: v3.4.0rc~999^2 X-Git-Url: https://gitweb.dragonflybsd.org/~tuxillo/dragonfly.git/commitdiff_plain/cb31dff3c5e12b338b6832cfde4445d76ea2b317 kernel - Use atomic op for usched_global_cpumask * 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. --- diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index e6951bbe0f..e26994eaba 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -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)); } diff --git a/sys/kern/lwkt_ipiq.c b/sys/kern/lwkt_ipiq.c index a7c31bc054..e8b326ead2 100644 --- a/sys/kern/lwkt_ipiq.c +++ b/sys/kern/lwkt_ipiq.c @@ -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) {