From 302ae5cc5c3e9a68ba1b2fcbc4ed6d8d6aa7efe8 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 31 Mar 2020 15:10:18 -0700 Subject: [PATCH] bdev_nvme: don't register multiple ctrlr destruct pollers. This change is aimed at fixing github issue #1312 where we are apparently calling the nvme_bdev_ctrlr_destruct function more than once. In the previous implementation, if a controller was resetting for more than one iteration of the poller, a second iteration of the poller would get registered. Signed-off-by: Seth Howell Change-Id: Ica01ecb21d76ea4f60624efd780bf4eea957c277 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1611 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- module/bdev/nvme/common.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module/bdev/nvme/common.c b/module/bdev/nvme/common.c index d2a2c6463..a6e7bad02 100644 --- a/module/bdev/nvme/common.c +++ b/module/bdev/nvme/common.c @@ -145,6 +145,13 @@ nvme_bdev_ctrlr_destruct(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr) { assert(nvme_bdev_ctrlr->destruct); pthread_mutex_lock(&g_bdev_nvme_mutex); + + /* If we have already registered a poller, let that one take care of it. */ + if (nvme_bdev_ctrlr->destruct_poller != NULL) { + pthread_mutex_unlock(&g_bdev_nvme_mutex); + return 1; + } + if (nvme_bdev_ctrlr->resetting) { nvme_bdev_ctrlr->destruct_poller = spdk_poller_register((spdk_poller_fn)nvme_bdev_ctrlr_destruct, nvme_bdev_ctrlr, 1000);