bdev/nvme: For reads, if there is only one element in the iov don't use
readv API It's cheaper to call spdk_nvme_ns_cmd_read_with_md than it is to call spdk_nvme_ns_cmd_readv_with_md, so do a quick check of the iovcnt and use the best one for the job. This is about a 15% improvement in I/Ops. Change-Id: I82e6677d1ac47abf9919f95e651e7a7595c5e9a3 Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4316 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
85ddcf6f8d
commit
3870092dd1
@ -2595,10 +2595,18 @@ bdev_nvme_readv(struct nvme_bdev *nbdev, struct spdk_io_channel *ch,
|
||||
bio->iovpos = 0;
|
||||
bio->iov_offset = 0;
|
||||
|
||||
rc = spdk_nvme_ns_cmd_readv_with_md(nbdev->nvme_ns->ns, nvme_ch->qpair, lba, lba_count,
|
||||
bdev_nvme_readv_done, bio, nbdev->disk.dif_check_flags,
|
||||
bdev_nvme_queued_reset_sgl, bdev_nvme_queued_next_sge,
|
||||
md, 0, 0);
|
||||
if (iovcnt == 1) {
|
||||
rc = spdk_nvme_ns_cmd_read_with_md(nbdev->nvme_ns->ns, nvme_ch->qpair, iov[0].iov_base, md, lba,
|
||||
lba_count,
|
||||
bdev_nvme_readv_done, bio,
|
||||
nbdev->disk.dif_check_flags,
|
||||
0, 0);
|
||||
} else {
|
||||
rc = spdk_nvme_ns_cmd_readv_with_md(nbdev->nvme_ns->ns, nvme_ch->qpair, lba, lba_count,
|
||||
bdev_nvme_readv_done, bio, nbdev->disk.dif_check_flags,
|
||||
bdev_nvme_queued_reset_sgl, bdev_nvme_queued_next_sge,
|
||||
md, 0, 0);
|
||||
}
|
||||
|
||||
if (rc != 0 && rc != -ENOMEM) {
|
||||
SPDK_ERRLOG("readv failed: rc = %d\n", rc);
|
||||
|
Loading…
Reference in New Issue
Block a user