Commit f84b70f6 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

bdev/nvme: Separate start and for_each_channel operations of _bdev_nvme_reset()



We need to pass bio only when the reset request came from the upper
layer. Previously, bdev_nvme_reset() called _bdev_nvme_reset() and
_bdev_nvme_reset() had the second parameter, ctx, to pass bio to
for_each_channel(). However, it was not clean.

Let's separate bdev_nvme_reset() which processes a reset request
came from the upper layer and _bdev_nvme_reset() which proesses
an internal reset request by adding a helper function
_bdev_nvme_reset_start().

The next patch will remove the second parameter, ctx, from
_bdev_nvme_reset() for clarification and further refactorings.

Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I2bd00e3abb56fe8d540b8af55743ee92ca9cd526
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6948


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent d22497a7
Loading
Loading
Loading
Loading
+39 −15
Original line number Diff line number Diff line
@@ -510,7 +510,7 @@ _bdev_nvme_reset_destroy_qpair(struct spdk_io_channel_iter *i)
}

static int
_bdev_nvme_reset(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, void *ctx)
_bdev_nvme_reset_start(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr)
{
	pthread_mutex_lock(&nvme_bdev_ctrlr->mutex);
	if (nvme_bdev_ctrlr->destruct) {
@@ -527,14 +527,24 @@ _bdev_nvme_reset(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, void *ctx)
	nvme_bdev_ctrlr->resetting = true;

	pthread_mutex_unlock(&nvme_bdev_ctrlr->mutex);
	return 0;
}

static int
_bdev_nvme_reset(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, void *ctx)
{
	int rc;

	rc = _bdev_nvme_reset_start(nvme_bdev_ctrlr);
	if (rc == 0) {
		/* First, delete all NVMe I/O queue pairs. */
		spdk_for_each_channel(nvme_bdev_ctrlr,
				      _bdev_nvme_reset_destroy_qpair,
				      ctx,
				      _bdev_nvme_reset_ctrlr);
	}

	return 0;
	return rc;
}

static int
@@ -562,16 +572,16 @@ bdev_nvme_reset(struct nvme_io_channel *nvme_ch, struct nvme_bdev_io *bio)
}

static int
bdev_nvme_failover(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, bool remove)
_bdev_nvme_failover_start(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, bool remove)
{
	struct nvme_bdev_ctrlr_trid *curr_trid = NULL, *next_trid = NULL;
	int rc = 0;
	int rc;

	pthread_mutex_lock(&nvme_bdev_ctrlr->mutex);
	if (nvme_bdev_ctrlr->destruct) {
		pthread_mutex_unlock(&nvme_bdev_ctrlr->mutex);
		/* Don't bother resetting if the controller is in the process of being destructed. */
		return 0;
		return -EBUSY;
	}

	curr_trid = TAILQ_FIRST(&nvme_bdev_ctrlr->trids);
@@ -582,6 +592,8 @@ bdev_nvme_failover(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, bool remove)
	if (nvme_bdev_ctrlr->resetting) {
		if (next_trid && !nvme_bdev_ctrlr->failover_in_progress) {
			rc = -EAGAIN;
		} else {
			rc = -EBUSY;
		}
		pthread_mutex_unlock(&nvme_bdev_ctrlr->mutex);
		SPDK_NOTICELOG("Unable to perform reset, already in progress.\n");
@@ -614,12 +626,24 @@ bdev_nvme_failover(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, bool remove)
	}

	pthread_mutex_unlock(&nvme_bdev_ctrlr->mutex);
	return 0;
}

static int
bdev_nvme_failover(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, bool remove)
{
	int rc;

	rc = _bdev_nvme_failover_start(nvme_bdev_ctrlr, remove);
	if (rc == 0) {
		/* First, delete all NVMe I/O queue pairs. */
		spdk_for_each_channel(nvme_bdev_ctrlr,
				      _bdev_nvme_reset_destroy_qpair,
				      NULL,
				      _bdev_nvme_reset_ctrlr);
	} else if (rc != -EBUSY) {
		return rc;
	}

	return 0;
}