From 7b0a5d1e407c57f8aa322df22acd2f3c288a0971 Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 21 Sep 2020 03:26:50 +0000 Subject: [PATCH] Fix TSAN errors in fastlock Former-commit-id: 2e159e6ea3fa8bb26c2f471f1493ab6593b85cff --- src/fastlock.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/fastlock.cpp b/src/fastlock.cpp index 60eb653bf..f413ebd0a 100644 --- a/src/fastlock.cpp +++ b/src/fastlock.cpp @@ -343,7 +343,9 @@ extern "C" void fastlock_lock(struct fastlock *lock) unsigned myticket = __atomic_fetch_add(&lock->m_ticket.m_avail, 1, __ATOMIC_RELEASE); unsigned cloops = 0; ticket ticketT; - unsigned loopLimit = g_fHighCpuPressure ? 0x10000 : 0x100000; + int fHighPressure; + __atomic_load(&g_fHighCpuPressure, &fHighPressure, __ATOMIC_RELAXED); + unsigned loopLimit = fHighPressure ? 0x10000 : 0x100000; for (;;) { @@ -478,16 +480,19 @@ void fastlock_auto_adjust_waits() { #ifdef __linux__ struct sysinfo sysinf; - auto fHighPressurePrev = g_fHighCpuPressure; + int fHighPressurePrev, fHighPressureNew; + __atomic_load(&g_fHighCpuPressure, &fHighPressurePrev, __ATOMIC_RELAXED); + fHighPressureNew = fHighPressurePrev; memset(&sysinf, 0, sizeof sysinf); if (!sysinfo(&sysinf)) { auto avgCoreLoad = sysinf.loads[0] / get_nprocs(); - g_fHighCpuPressure = (avgCoreLoad > ((1 << SI_LOAD_SHIFT) * 0.9)); - if (g_fHighCpuPressure) + int fHighPressureNew = (avgCoreLoad > ((1 << SI_LOAD_SHIFT) * 0.9)); + __atomic_store(&g_fHighCpuPressure, &fHighPressureNew, __ATOMIC_RELEASE); + if (fHighPressureNew) serverLog(!fHighPressurePrev ? 3 /*LL_WARNING*/ : 1 /* LL_VERBOSE */, "NOTICE: Detuning locks due to high load per core: %.2f%%", avgCoreLoad / (double)(1 << SI_LOAD_SHIFT)*100.0); } - if (!g_fHighCpuPressure && fHighPressurePrev) { + if (!fHighPressureNew && fHighPressurePrev) { serverLog(3 /*LL_WARNING*/, "NOTICE: CPU pressure reduced"); } #else