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:
parent
1399a42bbc
commit
644fc12061
@ -2822,7 +2822,7 @@ _nvmf_rdma_try_disconnect(void *ctx)
|
|||||||
static inline void
|
static inline void
|
||||||
spdk_nvmf_rdma_start_disconnect(struct spdk_nvmf_rdma_qpair *rqpair)
|
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);
|
_nvmf_rdma_try_disconnect(&rqpair->qpair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 state)
|
||||||
{
|
{
|
||||||
enum spdk_nvmf_subsystem_state actual_old_state, expected_old_state;
|
enum spdk_nvmf_subsystem_state actual_old_state, expected_old_state;
|
||||||
|
bool exchanged;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case SPDK_NVMF_SUBSYSTEM_INACTIVE:
|
case SPDK_NVMF_SUBSYSTEM_INACTIVE:
|
||||||
@ -404,8 +405,10 @@ spdk_nvmf_subsystem_set_state(struct spdk_nvmf_subsystem *subsystem,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
actual_old_state = __sync_val_compare_and_swap(&subsystem->state, expected_old_state, state);
|
actual_old_state = expected_old_state;
|
||||||
if (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 &&
|
if (actual_old_state == SPDK_NVMF_SUBSYSTEM_RESUMING &&
|
||||||
state == SPDK_NVMF_SUBSYSTEM_ACTIVE) {
|
state == SPDK_NVMF_SUBSYSTEM_ACTIVE) {
|
||||||
expected_old_state = SPDK_NVMF_SUBSYSTEM_RESUMING;
|
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) {
|
state == SPDK_NVMF_SUBSYSTEM_DEACTIVATING) {
|
||||||
expected_old_state = SPDK_NVMF_SUBSYSTEM_ACTIVATING;
|
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);
|
assert(actual_old_state == expected_old_state);
|
||||||
return actual_old_state - expected_old_state;
|
return actual_old_state - expected_old_state;
|
||||||
|
Loading…
Reference in New Issue
Block a user