All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4] nvme: add vectored-io support for user-passthru
       [not found] <CGME20220210054304epcas5p14aa9d83205f74b2e4942ed9b4e43fc23@epcas5p1.samsung.com>
@ 2022-02-10  5:37 ` Kanchan Joshi
  2022-02-16  8:02   ` Christoph Hellwig
  2022-02-28 11:48   ` Christoph Hellwig
  0 siblings, 2 replies; 5+ messages in thread
From: Kanchan Joshi @ 2022-02-10  5:37 UTC (permalink / raw)
  To: hch, kbusch, axboe; +Cc: linux-nvme, kch, sagi, joshiiitr

wire up support for passthru that takes an array of buffers (using
iovec).
Exposed via a new ioctl NVME_IOCTL_IO64_CMD_VEC for which -

1. cmd.addr is base address of user iovec array
2. cmd.vec_cnt is count of iovec array elements

This patch does not include vectored-variant for admin-commands as most
of them are light on buffers and likely to have low invocation frequency.

Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
---

Changes since v3:
- remove newline (sagi)
- add tags

Changes since v2:
- remove wrappers (hch)
- update commit message (hch)

Changes since v1:
- added new ioctl rather than reusing NVME_IOCTL_IO64_CMD (hch)
- dropped block-layer helper and open-coded in nvme instead (hch)

 drivers/nvme/host/ioctl.c       | 35 ++++++++++++++++++++++++---------
 include/uapi/linux/nvme_ioctl.h |  6 +++++-
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c
index 22314962842d..aaf3dfad2657 100644
--- a/drivers/nvme/host/ioctl.c
+++ b/drivers/nvme/host/ioctl.c
@@ -56,7 +56,7 @@ static void *nvme_add_user_metadata(struct bio *bio, void __user *ubuf,
 static int nvme_submit_user_cmd(struct request_queue *q,
 		struct nvme_command *cmd, void __user *ubuffer,
 		unsigned bufflen, void __user *meta_buffer, unsigned meta_len,
-		u32 meta_seed, u64 *result, unsigned timeout)
+		u32 meta_seed, u64 *result, unsigned timeout, bool vec)
 {
 	bool write = nvme_is_write(cmd);
 	struct nvme_ns *ns = q->queuedata;
@@ -75,8 +75,22 @@ static int nvme_submit_user_cmd(struct request_queue *q,
 	nvme_req(req)->flags |= NVME_REQ_USERCMD;
 
 	if (ubuffer && bufflen) {
-		ret = blk_rq_map_user(q, req, NULL, ubuffer, bufflen,
+		if (!vec)
+			ret = blk_rq_map_user(q, req, NULL, ubuffer, bufflen,
 				GFP_KERNEL);
+		else {
+			struct iovec fast_iov[UIO_FASTIOV];
+			struct iovec *iov = fast_iov;
+			struct iov_iter iter;
+
+			ret = import_iovec(rq_data_dir(req), ubuffer, bufflen,
+					UIO_FASTIOV, &iov, &iter);
+			if (ret < 0)
+				goto out;
+			ret = blk_rq_map_user_iov(q, req, NULL, &iter,
+					GFP_KERNEL);
+			kfree(iov);
+		}
 		if (ret)
 			goto out;
 		bio = req->bio;
@@ -170,7 +184,8 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
 
 	return nvme_submit_user_cmd(ns->queue, &c,
 			nvme_to_user_ptr(io.addr), length,
-			metadata, meta_len, lower_32_bits(io.slba), NULL, 0);
+			metadata, meta_len, lower_32_bits(io.slba), NULL, 0,
+			false);
 }
 
 static bool nvme_validate_passthru_nsid(struct nvme_ctrl *ctrl,
@@ -224,7 +239,7 @@ static int nvme_user_cmd(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
 	status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c,
 			nvme_to_user_ptr(cmd.addr), cmd.data_len,
 			nvme_to_user_ptr(cmd.metadata), cmd.metadata_len,
-			0, &result, timeout);
+			0, &result, timeout, false);
 
 	if (status >= 0) {
 		if (put_user(result, &ucmd->result))
@@ -235,7 +250,7 @@ static int nvme_user_cmd(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
 }
 
 static int nvme_user_cmd64(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
-			struct nvme_passthru_cmd64 __user *ucmd)
+			struct nvme_passthru_cmd64 __user *ucmd, bool vec)
 {
 	struct nvme_passthru_cmd64 cmd;
 	struct nvme_command c;
@@ -270,7 +285,7 @@ static int nvme_user_cmd64(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
 	status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c,
 			nvme_to_user_ptr(cmd.addr), cmd.data_len,
 			nvme_to_user_ptr(cmd.metadata), cmd.metadata_len,
-			0, &cmd.result, timeout);
+			0, &cmd.result, timeout, vec);
 
 	if (status >= 0) {
 		if (put_user(cmd.result, &ucmd->result))
@@ -296,7 +311,7 @@ static int nvme_ctrl_ioctl(struct nvme_ctrl *ctrl, unsigned int cmd,
 	case NVME_IOCTL_ADMIN_CMD:
 		return nvme_user_cmd(ctrl, NULL, argp);
 	case NVME_IOCTL_ADMIN64_CMD:
-		return nvme_user_cmd64(ctrl, NULL, argp);
+		return nvme_user_cmd64(ctrl, NULL, argp, false);
 	default:
 		return sed_ioctl(ctrl->opal_dev, cmd, argp);
 	}
@@ -340,7 +355,9 @@ static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned int cmd,
 	case NVME_IOCTL_SUBMIT_IO:
 		return nvme_submit_io(ns, argp);
 	case NVME_IOCTL_IO64_CMD:
-		return nvme_user_cmd64(ns->ctrl, ns, argp);
+		return nvme_user_cmd64(ns->ctrl, ns, argp, false);
+	case NVME_IOCTL_IO64_CMD_VEC:
+		return nvme_user_cmd64(ns->ctrl, ns, argp, true);
 	default:
 		return -ENOTTY;
 	}
@@ -480,7 +497,7 @@ long nvme_dev_ioctl(struct file *file, unsigned int cmd,
 	case NVME_IOCTL_ADMIN_CMD:
 		return nvme_user_cmd(ctrl, NULL, argp);
 	case NVME_IOCTL_ADMIN64_CMD:
-		return nvme_user_cmd64(ctrl, NULL, argp);
+		return nvme_user_cmd64(ctrl, NULL, argp, false);
 	case NVME_IOCTL_IO_CMD:
 		return nvme_dev_user_cmd(ctrl, argp);
 	case NVME_IOCTL_RESET:
diff --git a/include/uapi/linux/nvme_ioctl.h b/include/uapi/linux/nvme_ioctl.h
index d99b5a772698..b2e43185e3b5 100644
--- a/include/uapi/linux/nvme_ioctl.h
+++ b/include/uapi/linux/nvme_ioctl.h
@@ -55,7 +55,10 @@ struct nvme_passthru_cmd64 {
 	__u64	metadata;
 	__u64	addr;
 	__u32	metadata_len;
-	__u32	data_len;
+	union {
+		__u32	data_len; /* for non-vectored io */
+		__u32	vec_cnt; /* for vectored io */
+	};
 	__u32	cdw10;
 	__u32	cdw11;
 	__u32	cdw12;
@@ -78,5 +81,6 @@ struct nvme_passthru_cmd64 {
 #define NVME_IOCTL_RESCAN	_IO('N', 0x46)
 #define NVME_IOCTL_ADMIN64_CMD	_IOWR('N', 0x47, struct nvme_passthru_cmd64)
 #define NVME_IOCTL_IO64_CMD	_IOWR('N', 0x48, struct nvme_passthru_cmd64)
+#define NVME_IOCTL_IO64_CMD_VEC	_IOWR('N', 0x49, struct nvme_passthru_cmd64)
 
 #endif /* _UAPI_LINUX_NVME_IOCTL_H */
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v4] nvme: add vectored-io support for user-passthru
  2022-02-10  5:37 ` [PATCH v4] nvme: add vectored-io support for user-passthru Kanchan Joshi
@ 2022-02-16  8:02   ` Christoph Hellwig
  2022-02-28 11:48   ` Christoph Hellwig
  1 sibling, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2022-02-16  8:02 UTC (permalink / raw)
  To: Kanchan Joshi; +Cc: hch, kbusch, axboe, linux-nvme, kch, sagi, joshiiitr

Thanks,

applied to nvme-5.18.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v4] nvme: add vectored-io support for user-passthru
  2022-02-10  5:37 ` [PATCH v4] nvme: add vectored-io support for user-passthru Kanchan Joshi
  2022-02-16  8:02   ` Christoph Hellwig
@ 2022-02-28 11:48   ` Christoph Hellwig
  2022-02-28 12:41     ` Kanchan Joshi
  1 sibling, 1 reply; 5+ messages in thread
From: Christoph Hellwig @ 2022-02-28 11:48 UTC (permalink / raw)
  To: Kanchan Joshi; +Cc: hch, kbusch, axboe, linux-nvme, kch, sagi, joshiiitr

Btw, I noticed this is not wired up for the /dev/ngX character device.
Can you send a follow on patch for that?


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v4] nvme: add vectored-io support for user-passthru
  2022-02-28 11:48   ` Christoph Hellwig
@ 2022-02-28 12:41     ` Kanchan Joshi
  2022-03-01  8:09       ` Christoph Hellwig
  0 siblings, 1 reply; 5+ messages in thread
From: Kanchan Joshi @ 2022-02-28 12:41 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Kanchan Joshi, Keith Busch, Jens Axboe, linux-nvme, kch,
	Sagi Grimberg

On Mon, Feb 28, 2022 at 5:18 PM Christoph Hellwig <hch@lst.de> wrote:
>
> Btw, I noticed this is not wired up for the /dev/ngX character device.
> Can you send a follow on patch for that?

Err, do you see that it is not working? I actually tested it over both
block and char.
My test utility did write-vectored to /dev/nvme0n1 followed by
read-vectored from /dev/ng0n1, and did data-comparison. It passed.

Code wise, the handler for NVME_IOCTL_IO64_CMD_VEC is added insided
nvme_ns_ioctl().
- for non-multipath char node:
nvme_ns_chr_ioctl -> __nvme_ioctl -> nvme_ns_ioctl
- for multipath char node:
 nvme_ns_head_chr_ioctl -> nvme_ns_ioctl

Please let me know how I can produce the failure that you see.

Thanks,
-- 
Joshi


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v4] nvme: add vectored-io support for user-passthru
  2022-02-28 12:41     ` Kanchan Joshi
@ 2022-03-01  8:09       ` Christoph Hellwig
  0 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2022-03-01  8:09 UTC (permalink / raw)
  To: Kanchan Joshi
  Cc: Christoph Hellwig, Kanchan Joshi, Keith Busch, Jens Axboe,
	linux-nvme, kch, Sagi Grimberg

On Mon, Feb 28, 2022 at 06:11:39PM +0530, Kanchan Joshi wrote:
> On Mon, Feb 28, 2022 at 5:18 PM Christoph Hellwig <hch@lst.de> wrote:
> >
> > Btw, I noticed this is not wired up for the /dev/ngX character device.
> > Can you send a follow on patch for that?
> 
> Err, do you see that it is not working? I actually tested it over both
> block and char.
> My test utility did write-vectored to /dev/nvme0n1 followed by
> read-vectored from /dev/ng0n1, and did data-comparison. It passed.
> 
> Code wise, the handler for NVME_IOCTL_IO64_CMD_VEC is added insided
> nvme_ns_ioctl().
> - for non-multipath char node:
> nvme_ns_chr_ioctl -> __nvme_ioctl -> nvme_ns_ioctl
> - for multipath char node:
>  nvme_ns_head_chr_ioctl -> nvme_ns_ioctl
> 
> Please let me know how I can produce the failure that you see.

You're right.  We do support it for /dev/ngX, just not the /dev/nvmeX
character devices, which is a good thing.


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-03-01  8:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CGME20220210054304epcas5p14aa9d83205f74b2e4942ed9b4e43fc23@epcas5p1.samsung.com>
2022-02-10  5:37 ` [PATCH v4] nvme: add vectored-io support for user-passthru Kanchan Joshi
2022-02-16  8:02   ` Christoph Hellwig
2022-02-28 11:48   ` Christoph Hellwig
2022-02-28 12:41     ` Kanchan Joshi
2022-03-01  8:09       ` Christoph Hellwig

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.