From f5b8ac0efffbdc61190061cc8b30fae2c233a552 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 25 Aug 2021 12:18:56 +0900 Subject: [PATCH] bdev/nvme: Pass ext_opts via a parameter to bdev_nvme_readv/writev We get ext_opts by getting spdk_bdev_io from nvme_bdev_io in bdev_nvme_readv() or bdev_nvme_writev() now. But this is not aligned with the current design pattern and not so efficient. We pass contents of bdev_io via parameters to bdev_nvme_readv() or bdev_nvme_writev(). Let's follow it about ext_opts. Signed-off-by: Shuhei Matsumoto Change-Id: I8a43f31934a36fa2d43800ec8bf17916edfca477 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9292 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Reviewed-by: Paul Luse Reviewed-by: Ben Walker Reviewed-by: Konrad Sztyber --- module/bdev/nvme/bdev_nvme.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index d18e6c8cb..4cc58c5b0 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -153,14 +153,14 @@ static void bdev_nvme_library_fini(void); static int bdev_nvme_readv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, void *md, uint64_t lba_count, uint64_t lba, - uint32_t flags); + uint32_t flags, struct spdk_bdev_ext_io_opts *ext_opts); static int bdev_nvme_no_pi_readv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, void *md, uint64_t lba_count, uint64_t lba); static int bdev_nvme_writev(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, void *md, uint64_t lba_count, uint64_t lba, - uint32_t flags); + uint32_t flags, struct spdk_bdev_ext_io_opts *ext_opts); static int bdev_nvme_zone_appendv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, void *md, uint64_t lba_count, @@ -831,7 +831,8 @@ bdev_nvme_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io, bdev_io->u.bdev.md_buf, bdev_io->u.bdev.num_blocks, bdev_io->u.bdev.offset_blocks, - bdev->dif_check_flags); + bdev->dif_check_flags, + bdev_io->internal.ext_opts); exit: if (spdk_unlikely(ret != 0)) { @@ -866,7 +867,8 @@ bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i bdev_io->u.bdev.md_buf, bdev_io->u.bdev.num_blocks, bdev_io->u.bdev.offset_blocks, - bdev->dif_check_flags); + bdev->dif_check_flags, + bdev_io->internal.ext_opts); } else { spdk_bdev_io_get_buf(bdev_io, bdev_nvme_get_buf_cb, bdev_io->u.bdev.num_blocks * bdev->blocklen); @@ -882,7 +884,8 @@ bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i bdev_io->u.bdev.md_buf, bdev_io->u.bdev.num_blocks, bdev_io->u.bdev.offset_blocks, - bdev->dif_check_flags); + bdev->dif_check_flags, + bdev_io->internal.ext_opts); break; case SPDK_BDEV_IO_TYPE_COMPARE: rc = bdev_nvme_comparev(ns, @@ -3293,10 +3296,10 @@ bdev_nvme_no_pi_readv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, static int bdev_nvme_readv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, - void *md, uint64_t lba_count, uint64_t lba, uint32_t flags) + void *md, uint64_t lba_count, uint64_t lba, uint32_t flags, + struct spdk_bdev_ext_io_opts *ext_opts) { int rc; - struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(bio); SPDK_DEBUGLOG(bdev_nvme, "read %" PRIu64 " blocks with offset %#" PRIx64 "\n", lba_count, lba); @@ -3306,10 +3309,10 @@ bdev_nvme_readv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, bio->iovpos = 0; bio->iov_offset = 0; - if (bdev_io->internal.ext_opts) { + if (ext_opts) { bio->ext_opts.size = sizeof(struct spdk_nvme_ns_cmd_ext_io_opts); - bio->ext_opts.memory_domain = bdev_io->internal.ext_opts->memory_domain; - bio->ext_opts.memory_domain_ctx = bdev_io->internal.ext_opts->memory_domain_ctx; + bio->ext_opts.memory_domain = ext_opts->memory_domain; + bio->ext_opts.memory_domain_ctx = ext_opts->memory_domain_ctx; bio->ext_opts.io_flags = flags; bio->ext_opts.metadata = md; @@ -3340,10 +3343,9 @@ static int bdev_nvme_writev(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, void *md, uint64_t lba_count, uint64_t lba, - uint32_t flags) + uint32_t flags, struct spdk_bdev_ext_io_opts *ext_opts) { int rc; - struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(bio); SPDK_DEBUGLOG(bdev_nvme, "write %" PRIu64 " blocks with offset %#" PRIx64 "\n", lba_count, lba); @@ -3353,10 +3355,10 @@ bdev_nvme_writev(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, bio->iovpos = 0; bio->iov_offset = 0; - if (bdev_io->internal.ext_opts) { + if (ext_opts) { bio->ext_opts.size = sizeof(struct spdk_nvme_ns_cmd_ext_io_opts); - bio->ext_opts.memory_domain = bdev_io->internal.ext_opts->memory_domain; - bio->ext_opts.memory_domain_ctx = bdev_io->internal.ext_opts->memory_domain_ctx; + bio->ext_opts.memory_domain = ext_opts->memory_domain; + bio->ext_opts.memory_domain_ctx = ext_opts->memory_domain_ctx; bio->ext_opts.io_flags = flags; bio->ext_opts.metadata = md;