From: Minwoo Im <minwoo.im.dev@gmail.com>
To: fio@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>, Vincent Fu <vincent.fu@samsung.com>,
Minwoo Im <minwoo.im@samsung.com>,
Minwoo Im <minwoo.im.dev@gmail.com>
Subject: [PATCH] io_uring: Support Compare command for verification
Date: Thu, 26 Sep 2024 10:08:02 +0900 [thread overview]
Message-ID: <20240926010802.27131-1-minwoo.im.dev@gmail.com> (raw)
Added 'verify_mode' option to io_uiring_cmd with --cmd_type=nvme to
support data compare verification with Compare commands rather than Read
commands. This patch newly added IO_U_F_VER_IN_DEV io_u flag to
represent that verification should be done in device side, not the host
side to skip the actual verification phase in verify_io_u().
Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com>
---
engines/io_uring.c | 41 ++++++++++++++++++++++++++++++++++++++++-
engines/nvme.c | 5 +++--
engines/nvme.h | 4 +++-
fio.1 | 14 ++++++++++++++
io_u.h | 1 +
verify.c | 7 +++++++
6 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/engines/io_uring.c b/engines/io_uring.c
index 96a042a88820..9ddff2d25ad3 100644
--- a/engines/io_uring.c
+++ b/engines/io_uring.c
@@ -41,6 +41,11 @@ enum uring_cmd_write_mode {
FIO_URING_CMD_WMODE_VERIFY,
};
+enum uring_cmd_verify_mode {
+ FIO_URING_CMD_VMODE_READ = 1,
+ FIO_URING_CMD_VMODE_COMPARE,
+};
+
struct io_sq_ring {
unsigned *head;
unsigned *tail;
@@ -99,6 +104,7 @@ struct ioring_options {
unsigned int readfua;
unsigned int writefua;
unsigned int write_mode;
+ unsigned int verify_mode;
struct cmdprio_options cmdprio_options;
unsigned int fixedbufs;
unsigned int registerfiles;
@@ -194,6 +200,26 @@ static struct fio_option options[] = {
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_IOURING,
},
+ {
+ .name = "verify_mode",
+ .lname = "Do verify based on the configured command (e.g., Read or Compare command)",
+ .type = FIO_OPT_STR,
+ .off1 = offsetof(struct ioring_options, verify_mode),
+ .help = "Issue Read or Compare command in the verification phase",
+ .def = "read",
+ .posval = {
+ { .ival = "read",
+ .oval = FIO_URING_CMD_VMODE_READ,
+ .help = "Issue Read commands in the verification phase"
+ },
+ { .ival = "compare",
+ .oval = FIO_URING_CMD_VMODE_COMPARE,
+ .help = "Issue Compare commands in the verification phase"
+ },
+ },
+ .category = FIO_OPT_C_ENGINE,
+ .group = FIO_OPT_G_IOURING,
+ },
{
.name = "fixedbufs",
.lname = "Fixed (pre-mapped) IO buffers",
@@ -443,6 +469,7 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
struct nvme_dsm *dsm;
void *ptr = ld->dsm;
unsigned int dsm_size;
+ uint8_t read_opcode = nvme_cmd_read;
/* only supports nvme_uring_cmd */
if (o->cmd_type != FIO_URING_CMD_NVME)
@@ -483,9 +510,21 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
ptr += io_u->index * dsm_size;
dsm = (struct nvme_dsm *)ptr;
+ /*
+ * If READ command belongs to the verification phase and the
+ * verify_mode=compare, convert READ to COMPARE command.
+ */
+ if (io_u->flags & IO_U_F_VER_LIST && io_u->ddir == DDIR_READ &&
+ o->verify_mode == FIO_URING_CMD_VMODE_COMPARE) {
+ populate_verify_io_u(td, io_u);
+ read_opcode = nvme_cmd_compare;
+ io_u_set(td, io_u, IO_U_F_VER_IN_DEV);
+ }
+
return fio_nvme_uring_cmd_prep(cmd, io_u,
o->nonvectored ? NULL : &ld->iovecs[io_u->index],
- dsm, ld->write_opcode, ld->cdw12_flags[io_u->ddir]);
+ dsm, read_opcode, ld->write_opcode,
+ ld->cdw12_flags[io_u->ddir]);
}
static struct io_u *fio_ioring_event(struct thread_data *td, int event)
diff --git a/engines/nvme.c b/engines/nvme.c
index 33d874773799..18010c0b5573 100644
--- a/engines/nvme.c
+++ b/engines/nvme.c
@@ -363,7 +363,8 @@ void fio_nvme_uring_cmd_trim_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
struct iovec *iov, struct nvme_dsm *dsm,
- uint8_t write_opcode, unsigned int cdw12_flags)
+ uint8_t read_opcode, uint8_t write_opcode,
+ unsigned int cdw12_flags)
{
struct nvme_data *data = FILE_ENG_DATA(io_u->file);
__u64 slba;
@@ -373,7 +374,7 @@ int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
switch (io_u->ddir) {
case DDIR_READ:
- cmd->opcode = nvme_cmd_read;
+ cmd->opcode = read_opcode;
break;
case DDIR_WRITE:
cmd->opcode = write_opcode;
diff --git a/engines/nvme.h b/engines/nvme.h
index b5fef2fb2cf8..60b38d7fd8a5 100644
--- a/engines/nvme.h
+++ b/engines/nvme.h
@@ -77,6 +77,7 @@ enum nvme_io_opcode {
nvme_cmd_write = 0x01,
nvme_cmd_read = 0x02,
nvme_cmd_write_uncor = 0x04,
+ nvme_cmd_compare = 0x05,
nvme_cmd_write_zeroes = 0x08,
nvme_cmd_dsm = 0x09,
nvme_cmd_verify = 0x0c,
@@ -431,7 +432,8 @@ int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, __u32 pi_act,
int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
struct iovec *iov, struct nvme_dsm *dsm,
- uint8_t write_opcode, unsigned int cdw12_flags);
+ uint8_t read_opcode, uint8_t write_opcode,
+ unsigned int cdw12_flags);
void fio_nvme_pi_fill(struct nvme_uring_cmd *cmd, struct io_u *io_u,
struct nvme_cmd_ext_io_opts *opts);
diff --git a/fio.1 b/fio.1
index 0fd0fb25f288..356980b5e0b4 100644
--- a/fio.1
+++ b/fio.1
@@ -2675,6 +2675,20 @@ Use Verify commands for write operations
.RE
.RE
.TP
+.BI (io_uring_cmd)verify_mode \fR=\fPstr
+Specifies the type of command to be used in the verification phase. Defaults to 'read'.
+.RS
+.RS
+.TP
+.B read
+Use Read commands for data verification
+.TP
+.B compare
+Use Compare commands for data verification
+.TP
+.RE
+.RE
+.TP
.BI (sg)sg_write_mode \fR=\fPstr
Specify the type of write commands to issue. This option can take multiple
values:
diff --git a/io_u.h b/io_u.h
index ab93d50f967e..3eb60eb346e8 100644
--- a/io_u.h
+++ b/io_u.h
@@ -22,6 +22,7 @@ enum {
IO_U_F_BARRIER = 1 << 6,
IO_U_F_VER_LIST = 1 << 7,
IO_U_F_PATTERN_DONE = 1 << 8,
+ IO_U_F_VER_IN_DEV = 1 << 9, /* Verify data in device */
};
/*
diff --git a/verify.c b/verify.c
index f3d228ba7df8..2e113862f2a9 100644
--- a/verify.c
+++ b/verify.c
@@ -901,6 +901,13 @@ int verify_io_u(struct thread_data *td, struct io_u **io_u_ptr)
if (td_ioengine_flagged(td, FIO_FAKEIO))
return 0;
+ /*
+ * If data has already been verified from the device, we can skip
+ * the actual verification phase here.
+ */
+ if (io_u->flags & IO_U_F_VER_IN_DEV)
+ return 0;
+
if (io_u->flags & IO_U_F_TRIMMED) {
ret = verify_trimmed_io_u(td, io_u);
goto done;
--
2.34.1
next reply other threads:[~2024-09-26 1:08 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-26 1:08 Minwoo Im [this message]
2024-09-26 17:33 ` [PATCH] io_uring: Support Compare command for verification Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240926010802.27131-1-minwoo.im.dev@gmail.com \
--to=minwoo.im.dev@gmail.com \
--cc=axboe@kernel.dk \
--cc=fio@vger.kernel.org \
--cc=minwoo.im@samsung.com \
--cc=vincent.fu@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.