From acfb968aa8fe2a04bf8496026c399971d6a86bdf Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Fri, 18 Sep 2020 17:38:27 +0000 Subject: [PATCH] bdev/nvme: avoid spdk_bdev_io_get_buf call when possible The bdev layer nicely handles the case where we call this function with the buffers already present - it just immediately calls the get_buf_cb. But this adds extra overhead in the case where the buffer is already present. Since nvme has no alignment restrictions, we can just check the iovs directly and avoid the extra call to spdk_bdev_io_get_buf when possible. Signed-off-by: Jim Harris Change-Id: I66df0fde574a35e995a3432999d75bdbf9b27212 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4317 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Reviewed-by: Shuhei Matsumoto Reviewed-by: Tomasz Zawadzki --- module/bdev/nvme/bdev_nvme.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 659214cc5..f70c4f79c 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -574,8 +574,12 @@ _bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_ switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: - spdk_bdev_io_get_buf(bdev_io, bdev_nvme_get_buf_cb, - bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen); + if (bdev_io->u.bdev.iovs && bdev_io->u.bdev.iovs[0].iov_base) { + bdev_nvme_get_buf_cb(ch, bdev_io, true); + } else { + spdk_bdev_io_get_buf(bdev_io, bdev_nvme_get_buf_cb, + bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen); + } return 0; case SPDK_BDEV_IO_TYPE_WRITE: