From 23fd22e55b767be9c31fda57205afb2023cd6aad Mon Sep 17 00:00:00 2001 From: Kanchan Joshi Date: Fri, 30 Sep 2022 11:57:49 +0530 Subject: nvme: wire up fixed buffer support for nvme passthrough if io_uring sends passthrough command with IORING_URING_CMD_FIXED flag, use the pre-registered buffer for IO (non-vectored variant). Pass the buffer/length to io_uring and get the bvec iterator for the range. Next, pass this bvec to block-layer and obtain a bio/request for subsequent processing. Signed-off-by: Kanchan Joshi Link: https://lore.kernel.org/r/20220930062749.152261-13-anuj20.g@samsung.com Signed-off-by: Jens Axboe --- drivers/nvme/host/ioctl.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'drivers/nvme/host/ioctl.c') diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index 7a41caa9bfd2..81f5550b670d 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -95,8 +95,22 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer, void *meta = NULL; int ret; - ret = blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer), bufflen, - GFP_KERNEL, vec, 0, 0, rq_data_dir(req)); + if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) { + struct iov_iter iter; + + /* fixedbufs is only for non-vectored io */ + if (WARN_ON_ONCE(vec)) + return -EINVAL; + ret = io_uring_cmd_import_fixed(ubuffer, bufflen, + rq_data_dir(req), &iter, ioucmd); + if (ret < 0) + goto out; + ret = blk_rq_map_user_iov(q, req, NULL, &iter, GFP_KERNEL); + } else { + ret = blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer), + bufflen, GFP_KERNEL, vec, 0, 0, + rq_data_dir(req)); + } if (ret) goto out; -- cgit v1.2.3