Commit d4cbbf17 authored by Richael Zhuang's avatar Richael Zhuang Committed by Darek Stojaczyk
Browse files

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: default avatarRichael Zhuang <richael.zhuang@arm.com>
Change-Id: Ib6624ef8e45af497b9eced6ecfa7710bcc88a733
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/461590


Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 672d42b2
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -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