bdev/nvme: Refactor create/destroy_ctrlr_channel_cb()
The following patches will have the following changes. Add nvme_qpair object and move qpair and poll_group pointers and the io_path_list list from nvme_ctrlr_channel to nvme_qpair. nvme_qpair is allocated dynamically when creating nvme_ctrlr_channel, and nvme_ctrlr_channel points to nvme_qpair. qpair is disconnected asynchronously and nvme_ctrlr_channel is deleted asynchronously. To make the following patches simpler, refactor two functions, bdev_nvme_create_ctrlr_channel_cb() and bdev_nvme_destroy_ctrlr_channel_cb(). The details are as follows. Factor out nvme_qpair_create() from bdev_nvme_create_ctrlr_channel_cb() and factor out nvme_qpair_delete() from bdev_nvme_destroy_ctrlr_channel_cb(). Then reorder a few operation in these. Additionally, reorder a operation in _bdev_nvme_add_io_path(). Change-Id: Idf0328fa77a54f40fe52ca72c3842dde82d55972 Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11831 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
d7f0a1820e
commit
c1b0b339cf
@ -587,6 +587,8 @@ _bdev_nvme_add_io_path(struct nvme_bdev_channel *nbdev_ch, struct nvme_ns *nvme_
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
io_path->nvme_ns = nvme_ns;
|
||||||
|
|
||||||
ch = spdk_get_io_channel(nvme_ns->ctrlr);
|
ch = spdk_get_io_channel(nvme_ns->ctrlr);
|
||||||
if (ch == NULL) {
|
if (ch == NULL) {
|
||||||
free(io_path);
|
free(io_path);
|
||||||
@ -597,8 +599,6 @@ _bdev_nvme_add_io_path(struct nvme_bdev_channel *nbdev_ch, struct nvme_ns *nvme_
|
|||||||
io_path->ctrlr_ch = spdk_io_channel_get_ctx(ch);
|
io_path->ctrlr_ch = spdk_io_channel_get_ctx(ch);
|
||||||
TAILQ_INSERT_TAIL(&io_path->ctrlr_ch->io_path_list, io_path, tailq);
|
TAILQ_INSERT_TAIL(&io_path->ctrlr_ch->io_path_list, io_path, tailq);
|
||||||
|
|
||||||
io_path->nvme_ns = nvme_ns;
|
|
||||||
|
|
||||||
io_path->nbdev_ch = nbdev_ch;
|
io_path->nbdev_ch = nbdev_ch;
|
||||||
STAILQ_INSERT_TAIL(&nbdev_ch->io_path_list, io_path, stailq);
|
STAILQ_INSERT_TAIL(&nbdev_ch->io_path_list, io_path, stailq);
|
||||||
|
|
||||||
@ -2041,20 +2041,19 @@ bdev_nvme_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bdev_nvme_create_ctrlr_channel_cb(void *io_device, void *ctx_buf)
|
nvme_qpair_create(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ctrlr_channel *ctrlr_ch)
|
||||||
{
|
{
|
||||||
struct nvme_ctrlr *nvme_ctrlr = io_device;
|
|
||||||
struct nvme_ctrlr_channel *ctrlr_ch = ctx_buf;
|
|
||||||
struct spdk_io_channel *pg_ch;
|
struct spdk_io_channel *pg_ch;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
TAILQ_INIT(&ctrlr_ch->io_path_list);
|
||||||
|
|
||||||
pg_ch = spdk_get_io_channel(&g_nvme_bdev_ctrlrs);
|
pg_ch = spdk_get_io_channel(&g_nvme_bdev_ctrlrs);
|
||||||
if (!pg_ch) {
|
if (!pg_ch) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrlr_ch->group = spdk_io_channel_get_ctx(pg_ch);
|
ctrlr_ch->group = spdk_io_channel_get_ctx(pg_ch);
|
||||||
TAILQ_INSERT_TAIL(&ctrlr_ch->group->ctrlr_ch_list, ctrlr_ch, tailq);
|
|
||||||
|
|
||||||
#ifdef SPDK_CONFIG_VTUNE
|
#ifdef SPDK_CONFIG_VTUNE
|
||||||
ctrlr_ch->group->collect_spin_stat = true;
|
ctrlr_ch->group->collect_spin_stat = true;
|
||||||
@ -2062,26 +2061,41 @@ bdev_nvme_create_ctrlr_channel_cb(void *io_device, void *ctx_buf)
|
|||||||
ctrlr_ch->group->collect_spin_stat = false;
|
ctrlr_ch->group->collect_spin_stat = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TAILQ_INIT(&ctrlr_ch->pending_resets);
|
|
||||||
TAILQ_INIT(&ctrlr_ch->io_path_list);
|
|
||||||
|
|
||||||
rc = bdev_nvme_create_qpair(ctrlr_ch);
|
rc = bdev_nvme_create_qpair(ctrlr_ch);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
/* nvme ctrlr can't create IO qpair during reset. In that case ctrlr_ch->qpair
|
/* nvme ctrlr can't create IO qpair during reset. In that case ctrlr_ch->qpair
|
||||||
* pointer will be NULL and IO qpair will be created when reset completes.
|
* pointer will be NULL and IO qpair will be created when reset completes.
|
||||||
* If the user submits IO requests during reset, they will be queued and resubmitted later */
|
* If the user submits IO requests during reset, they will be queued and resubmitted later */
|
||||||
if (!nvme_ctrlr->resetting) {
|
if (!nvme_ctrlr->resetting) {
|
||||||
goto err_qpair;
|
spdk_put_io_channel(pg_ch);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TAILQ_INSERT_TAIL(&ctrlr_ch->group->ctrlr_ch_list, ctrlr_ch, tailq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bdev_nvme_create_ctrlr_channel_cb(void *io_device, void *ctx_buf)
|
||||||
|
{
|
||||||
|
struct nvme_ctrlr *nvme_ctrlr = io_device;
|
||||||
|
struct nvme_ctrlr_channel *ctrlr_ch = ctx_buf;
|
||||||
|
|
||||||
|
TAILQ_INIT(&ctrlr_ch->pending_resets);
|
||||||
|
|
||||||
|
return nvme_qpair_create(nvme_ctrlr, ctrlr_ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nvme_qpair_delete(struct nvme_ctrlr_channel *ctrlr_ch)
|
||||||
|
{
|
||||||
|
assert(ctrlr_ch->group != NULL);
|
||||||
|
|
||||||
err_qpair:
|
|
||||||
TAILQ_REMOVE(&ctrlr_ch->group->ctrlr_ch_list, ctrlr_ch, tailq);
|
TAILQ_REMOVE(&ctrlr_ch->group->ctrlr_ch_list, ctrlr_ch, tailq);
|
||||||
spdk_put_io_channel(pg_ch);
|
|
||||||
|
|
||||||
return rc;
|
spdk_put_io_channel(spdk_io_channel_from_ctx(ctrlr_ch->group));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2089,8 +2103,6 @@ bdev_nvme_destroy_ctrlr_channel_cb(void *io_device, void *ctx_buf)
|
|||||||
{
|
{
|
||||||
struct nvme_ctrlr_channel *ctrlr_ch = ctx_buf;
|
struct nvme_ctrlr_channel *ctrlr_ch = ctx_buf;
|
||||||
|
|
||||||
assert(ctrlr_ch->group != NULL);
|
|
||||||
|
|
||||||
_bdev_nvme_clear_io_path_cache(ctrlr_ch);
|
_bdev_nvme_clear_io_path_cache(ctrlr_ch);
|
||||||
|
|
||||||
if (ctrlr_ch->qpair != NULL) {
|
if (ctrlr_ch->qpair != NULL) {
|
||||||
@ -2098,9 +2110,7 @@ bdev_nvme_destroy_ctrlr_channel_cb(void *io_device, void *ctx_buf)
|
|||||||
ctrlr_ch->qpair = NULL;
|
ctrlr_ch->qpair = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAILQ_REMOVE(&ctrlr_ch->group->ctrlr_ch_list, ctrlr_ch, tailq);
|
nvme_qpair_delete(ctrlr_ch);
|
||||||
|
|
||||||
spdk_put_io_channel(spdk_io_channel_from_ctx(ctrlr_ch->group));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user