nvme: use atomic builtins for g_signal_lock

The __sync builtin based implementation generates full memory
barriers on some non-x86 platforms. Replace it with C11 atomic
builtins can make:
·arm and ppc from full barrier to half barrier
·x86 code same as before

Signed-off-by: Richael Zhuang <richael.zhuang@arm.com>
Change-Id: Ib6624ef8e45af497b9eced6ecfa7710bcc88a733
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/461590
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Richael Zhuang 2019-07-12 19:02:45 +08:00 committed by Darek Stojaczyk
parent 672d42b284
commit d4cbbf1751

View File

@ -210,7 +210,7 @@ static int nvme_pcie_qpair_construct(struct spdk_nvme_qpair *qpair,
static int nvme_pcie_qpair_destroy(struct spdk_nvme_qpair *qpair);
__thread struct nvme_pcie_ctrlr *g_thread_mmio_ctrlr = NULL;
static volatile uint16_t g_signal_lock;
static uint16_t g_signal_lock;
static bool g_sigset = false;
static int hotplug_fd = -1;
@ -218,8 +218,11 @@ static void
nvme_sigbus_fault_sighandler(int signum, siginfo_t *info, void *ctx)
{
void *map_address;
uint16_t flag = 0;
if (!__sync_bool_compare_and_swap(&g_signal_lock, 0, 1)) {
if (!__atomic_compare_exchange_n(&g_signal_lock, &flag, 1, false, __ATOMIC_ACQUIRE,
__ATOMIC_RELAXED)) {
SPDK_DEBUGLOG(SPDK_LOG_NVME, "request g_signal_lock failed\n");
return;
}
@ -231,15 +234,14 @@ nvme_sigbus_fault_sighandler(int signum, siginfo_t *info, void *ctx)
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
if (map_address == MAP_FAILED) {
SPDK_ERRLOG("mmap failed\n");
g_signal_lock = 0;
__atomic_store_n(&g_signal_lock, 0, __ATOMIC_RELEASE);
return;
}
memset(map_address, 0xFF, sizeof(struct spdk_nvme_registers));
g_thread_mmio_ctrlr->regs = (volatile struct spdk_nvme_registers *)map_address;
g_thread_mmio_ctrlr->is_remapped = true;
}
g_signal_lock = 0;
return;
__atomic_store_n(&g_signal_lock, 0, __ATOMIC_RELEASE);
}
static void