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:
parent
672d42b284
commit
d4cbbf1751
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user