nvmf: upgrade to C11 atomics

Replace legacy __sync builtins with C11 __atomic ones to leverage fine
memory order controlling.

Signed-off-by: Richael Zhuang <richael.zhuang@arm.com>
Change-Id: I8a1e976be6a0db73af4451a39a8f544310c72989
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/463458
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
Richael Zhuang 2019-07-29 13:56:38 +08:00 committed by Tomasz Zawadzki
parent 1399a42bbc
commit 644fc12061
2 changed files with 9 additions and 4 deletions

View File

@ -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);
}
}

View File

@ -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;