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);
|
static int nvme_pcie_qpair_destroy(struct spdk_nvme_qpair *qpair);
|
||||||
|
|
||||||
__thread struct nvme_pcie_ctrlr *g_thread_mmio_ctrlr = NULL;
|
__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 bool g_sigset = false;
|
||||||
static int hotplug_fd = -1;
|
static int hotplug_fd = -1;
|
||||||
|
|
||||||
@ -218,8 +218,11 @@ static void
|
|||||||
nvme_sigbus_fault_sighandler(int signum, siginfo_t *info, void *ctx)
|
nvme_sigbus_fault_sighandler(int signum, siginfo_t *info, void *ctx)
|
||||||
{
|
{
|
||||||
void *map_address;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,15 +234,14 @@ nvme_sigbus_fault_sighandler(int signum, siginfo_t *info, void *ctx)
|
|||||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
||||||
if (map_address == MAP_FAILED) {
|
if (map_address == MAP_FAILED) {
|
||||||
SPDK_ERRLOG("mmap failed\n");
|
SPDK_ERRLOG("mmap failed\n");
|
||||||
g_signal_lock = 0;
|
__atomic_store_n(&g_signal_lock, 0, __ATOMIC_RELEASE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memset(map_address, 0xFF, sizeof(struct spdk_nvme_registers));
|
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->regs = (volatile struct spdk_nvme_registers *)map_address;
|
||||||
g_thread_mmio_ctrlr->is_remapped = true;
|
g_thread_mmio_ctrlr->is_remapped = true;
|
||||||
}
|
}
|
||||||
g_signal_lock = 0;
|
__atomic_store_n(&g_signal_lock, 0, __ATOMIC_RELEASE);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user