bdev/nvme: Get ctrlr from ctrlr_channel by spdk_io_channel_get_io_device()

Previously nvme_ctrlr_channel had a pointer to a nvme_ctrlr and used it
throughout. However the use cases are not performance critical and
are better to convert from nvme_ctrlr_channel to nvme_ctrlr by
spdk_io_channel_get_ctx() and spdk_io_channel_get_io_device().

Provide a convenient macro nvme_ctrlr_channel_get_ctrlr() to do it.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Ie22e8c318af88e09b95824c67b3e874d85425f1a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9195
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: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Shuhei Matsumoto 2021-08-11 17:11:19 +09:00 committed by Tomasz Zawadzki
parent e2faef472b
commit 17d28590fd
2 changed files with 24 additions and 16 deletions

View File

@ -609,19 +609,21 @@ bdev_nvme_flush(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
static int
bdev_nvme_create_qpair(struct nvme_ctrlr_channel *ctrlr_ch)
{
struct spdk_nvme_ctrlr *ctrlr = ctrlr_ch->ctrlr->ctrlr;
struct nvme_ctrlr *nvme_ctrlr;
struct spdk_nvme_io_qpair_opts opts;
struct spdk_nvme_qpair *qpair;
int rc;
spdk_nvme_ctrlr_get_default_io_qpair_opts(ctrlr, &opts, sizeof(opts));
nvme_ctrlr = nvme_ctrlr_channel_get_ctrlr(ctrlr_ch);
spdk_nvme_ctrlr_get_default_io_qpair_opts(nvme_ctrlr->ctrlr, &opts, sizeof(opts));
opts.delay_cmd_submit = g_opts.delay_cmd_submit;
opts.create_only = true;
opts.async_mode = true;
opts.io_queue_requests = spdk_max(g_opts.io_queue_requests, opts.io_queue_requests);
g_opts.io_queue_requests = opts.io_queue_requests;
qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, &opts, sizeof(opts));
qpair = spdk_nvme_ctrlr_alloc_io_qpair(nvme_ctrlr->ctrlr, &opts, sizeof(opts));
if (qpair == NULL) {
return -1;
}
@ -634,7 +636,7 @@ bdev_nvme_create_qpair(struct nvme_ctrlr_channel *ctrlr_ch)
goto err;
}
rc = spdk_nvme_ctrlr_connect_io_qpair(ctrlr, qpair);
rc = spdk_nvme_ctrlr_connect_io_qpair(nvme_ctrlr->ctrlr, qpair);
if (rc != 0) {
SPDK_ERRLOG("Unable to connect I/O qpair.\n");
goto err;
@ -895,15 +897,18 @@ static int
bdev_nvme_reset_io(struct nvme_bdev_channel *nbdev_ch, struct nvme_bdev_io *bio)
{
struct nvme_ctrlr_channel *ctrlr_ch = nbdev_ch->ctrlr_ch;
struct nvme_ctrlr *nvme_ctrlr;
struct spdk_bdev_io *bdev_io;
int rc;
rc = bdev_nvme_reset(ctrlr_ch->ctrlr);
nvme_ctrlr = nvme_ctrlr_channel_get_ctrlr(ctrlr_ch);
rc = bdev_nvme_reset(nvme_ctrlr);
if (rc == 0) {
assert(ctrlr_ch->ctrlr->reset_cb_fn == NULL);
assert(ctrlr_ch->ctrlr->reset_cb_arg == NULL);
ctrlr_ch->ctrlr->reset_cb_fn = bdev_nvme_reset_io_complete;
ctrlr_ch->ctrlr->reset_cb_arg = bio;
assert(nvme_ctrlr->reset_cb_fn == NULL);
assert(nvme_ctrlr->reset_cb_arg == NULL);
nvme_ctrlr->reset_cb_fn = bdev_nvme_reset_io_complete;
nvme_ctrlr->reset_cb_arg = bio;
} else if (rc == -EBUSY) {
/*
* Reset call is queued only if it is from the app framework. This is on purpose so that
@ -1269,7 +1274,6 @@ bdev_nvme_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type)
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;
struct spdk_io_channel *pg_ch;
int rc;
@ -1289,8 +1293,6 @@ bdev_nvme_create_ctrlr_channel_cb(void *io_device, void *ctx_buf)
TAILQ_INIT(&ctrlr_ch->pending_resets);
ctrlr_ch->ctrlr = nvme_ctrlr;
rc = bdev_nvme_create_qpair(ctrlr_ch);
if (rc != 0) {
goto err_qpair;
@ -3827,10 +3829,11 @@ static int
bdev_nvme_admin_passthru(struct nvme_bdev_channel *nbdev_ch, struct nvme_bdev_io *bio,
struct spdk_nvme_cmd *cmd, void *buf, size_t nbytes)
{
struct nvme_ctrlr_channel *ctrlr_ch = nbdev_ch->ctrlr_ch;
struct nvme_ctrlr *nvme_ctrlr;
uint32_t max_xfer_size;
nvme_ctrlr = nbdev_ch->ctrlr_ch->ctrlr;
nvme_ctrlr = nvme_ctrlr_channel_get_ctrlr(ctrlr_ch);
max_xfer_size = spdk_nvme_ctrlr_get_max_xfer_size(nvme_ctrlr->ctrlr);
@ -3902,11 +3905,14 @@ bdev_nvme_abort(struct nvme_bdev_channel *nbdev_ch, struct nvme_bdev_io *bio,
struct nvme_bdev_io *bio_to_abort)
{
struct nvme_ctrlr_channel *ctrlr_ch = nbdev_ch->ctrlr_ch;
struct nvme_ctrlr *nvme_ctrlr;
int rc;
bio->orig_thread = spdk_get_thread();
rc = spdk_nvme_ctrlr_cmd_abort_ext(ctrlr_ch->ctrlr->ctrlr,
nvme_ctrlr = nvme_ctrlr_channel_get_ctrlr(ctrlr_ch);
rc = spdk_nvme_ctrlr_cmd_abort_ext(nvme_ctrlr->ctrlr,
ctrlr_ch->qpair,
bio_to_abort,
bdev_nvme_abort_done, bio);
@ -3914,7 +3920,7 @@ bdev_nvme_abort(struct nvme_bdev_channel *nbdev_ch, struct nvme_bdev_io *bio,
/* If no command was found in I/O qpair, the target command may be
* admin command.
*/
rc = spdk_nvme_ctrlr_cmd_abort_ext(ctrlr_ch->ctrlr->ctrlr,
rc = spdk_nvme_ctrlr_cmd_abort_ext(nvme_ctrlr->ctrlr,
NULL,
bio_to_abort,
bdev_nvme_abort_done, bio);

View File

@ -151,12 +151,14 @@ struct nvme_poll_group {
};
struct nvme_ctrlr_channel {
struct nvme_ctrlr *ctrlr;
struct spdk_nvme_qpair *qpair;
struct nvme_poll_group *group;
TAILQ_HEAD(, spdk_bdev_io) pending_resets;
};
#define nvme_ctrlr_channel_get_ctrlr(ctrlr_ch) \
(struct nvme_ctrlr *)spdk_io_channel_get_io_device(spdk_io_channel_from_ctx(ctrlr_ch))
struct nvme_bdev_channel {
struct nvme_ns *nvme_ns;
struct nvme_ctrlr_channel *ctrlr_ch;