From b030befb1d23c19e3164b6cf816a6487dcfe9865 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 12 Mar 2020 10:39:27 -0700 Subject: [PATCH] bdev/nvme: use mutex to protect 'resetting' member This isn't in the performance path, so using the mutex here makes it a bit more consistent with other ctrlr members such as 'destruct'. This prepares for a future patch which will defer ctrlr destruction on removal if a reset is in progress. Signed-off-by: Jim Harris Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1252 (master) (cherry picked from commit 2571cbd80721df366baba0d412ebe1b8b4345ef4) Change-Id: Ica019cd90dc3b46ef6a13dd311054dbdc95855aa Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1304 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker --- module/bdev/nvme/bdev_nvme.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 8590b58d3..27e50a83c 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -328,7 +328,9 @@ _bdev_nvme_reset_complete(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, int rc) SPDK_NOTICELOG("Resetting controller successful.\n"); } - __atomic_clear(&nvme_bdev_ctrlr->resetting, __ATOMIC_RELAXED); + pthread_mutex_lock(&g_bdev_nvme_mutex); + nvme_bdev_ctrlr->resetting = false; + pthread_mutex_unlock(&g_bdev_nvme_mutex); /* Make sure we clear any pending resets before returning. */ spdk_for_each_channel(nvme_bdev_ctrlr, _bdev_nvme_complete_pending_resets, @@ -425,7 +427,11 @@ bdev_nvme_reset(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct nvme_bdev_io *bi struct spdk_io_channel *ch; struct nvme_io_channel *nvme_ch; - if (__atomic_test_and_set(&nvme_bdev_ctrlr->resetting, __ATOMIC_RELAXED)) { + pthread_mutex_lock(&g_bdev_nvme_mutex); + if (!nvme_bdev_ctrlr->resetting) { + nvme_bdev_ctrlr->resetting = true; + } else { + pthread_mutex_unlock(&g_bdev_nvme_mutex); SPDK_NOTICELOG("Unable to perform reset, already in progress.\n"); /* * The internal reset calls won't be queued. This is on purpose so that we don't @@ -442,6 +448,7 @@ bdev_nvme_reset(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct nvme_bdev_io *bi return 0; } + pthread_mutex_unlock(&g_bdev_nvme_mutex); /* First, delete all NVMe I/O queue pairs. */ spdk_for_each_channel(nvme_bdev_ctrlr, _bdev_nvme_reset_destroy_qpair,