From 644fc1206113fbed25ab2fdb5d3e27b89f785abd Mon Sep 17 00:00:00 2001 From: Richael Zhuang Date: Mon, 29 Jul 2019 13:56:38 +0800 Subject: [PATCH] nvmf: upgrade to C11 atomics Replace legacy __sync builtins with C11 __atomic ones to leverage fine memory order controlling. Signed-off-by: Richael Zhuang Change-Id: I8a1e976be6a0db73af4451a39a8f544310c72989 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/463458 Tested-by: SPDK CI Jenkins Community-CI: Broadcom SPDK FC-NVMe CI Reviewed-by: Ben Walker Reviewed-by: Broadcom SPDK FC-NVMe CI Reviewed-by: Darek Stojaczyk --- lib/nvmf/rdma.c | 2 +- lib/nvmf/subsystem.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 77bd23a19..bfc0b5210 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -2822,7 +2822,7 @@ _nvmf_rdma_try_disconnect(void *ctx) static inline void spdk_nvmf_rdma_start_disconnect(struct spdk_nvmf_rdma_qpair *rqpair) { - if (__sync_bool_compare_and_swap(&rqpair->disconnect_started, false, true)) { + if (!__atomic_test_and_set(&rqpair->disconnect_started, __ATOMIC_RELAXED)) { _nvmf_rdma_try_disconnect(&rqpair->qpair); } } diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index d93f11f08..122bd486e 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -376,6 +376,7 @@ spdk_nvmf_subsystem_set_state(struct spdk_nvmf_subsystem *subsystem, enum spdk_nvmf_subsystem_state state) { enum spdk_nvmf_subsystem_state actual_old_state, expected_old_state; + bool exchanged; switch (state) { case SPDK_NVMF_SUBSYSTEM_INACTIVE: @@ -404,8 +405,10 @@ spdk_nvmf_subsystem_set_state(struct spdk_nvmf_subsystem *subsystem, return -1; } - actual_old_state = __sync_val_compare_and_swap(&subsystem->state, expected_old_state, state); - if (actual_old_state != expected_old_state) { + actual_old_state = expected_old_state; + exchanged = __atomic_compare_exchange_n(&subsystem->state, &actual_old_state, state, false, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); + if (spdk_unlikely(exchanged == false)) { if (actual_old_state == SPDK_NVMF_SUBSYSTEM_RESUMING && state == SPDK_NVMF_SUBSYSTEM_ACTIVE) { expected_old_state = SPDK_NVMF_SUBSYSTEM_RESUMING; @@ -415,7 +418,9 @@ spdk_nvmf_subsystem_set_state(struct spdk_nvmf_subsystem *subsystem, state == SPDK_NVMF_SUBSYSTEM_DEACTIVATING) { expected_old_state = SPDK_NVMF_SUBSYSTEM_ACTIVATING; } - actual_old_state = __sync_val_compare_and_swap(&subsystem->state, expected_old_state, state); + actual_old_state = expected_old_state; + __atomic_compare_exchange_n(&subsystem->state, &actual_old_state, state, false, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); } assert(actual_old_state == expected_old_state); return actual_old_state - expected_old_state;