From cb31dff3c5e12b338b6832cfde4445d76ea2b317 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 10 Oct 2012 23:43:03 -0700 Subject: [PATCH] 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. --- sys/kern/init_main.c | 2 +- sys/kern/lwkt_ipiq.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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) { -- 2.41.0