* [PATCH] io_uring: Support Compare command for verification
@ 2024-09-26 1:08 Minwoo Im
2024-09-26 17:33 ` Jens Axboe
0 siblings, 1 reply; 2+ messages in thread
From: Minwoo Im @ 2024-09-26 1:08 UTC (permalink / raw)
To: fio; +Cc: Jens Axboe, Vincent Fu, Minwoo Im, Minwoo Im
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] io_uring: Support Compare command for verification
2024-09-26 1:08 [PATCH] io_uring: Support Compare command for verification Minwoo Im
@ 2024-09-26 17:33 ` Jens Axboe
0 siblings, 0 replies; 2+ messages in thread
From: Jens Axboe @ 2024-09-26 17:33 UTC (permalink / raw)
To: fio, Minwoo Im; +Cc: Vincent Fu, Minwoo Im
On Thu, 26 Sep 2024 10:08:02 +0900, Minwoo Im wrote:
> 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().
>
>
> [...]
Applied, thanks!
[1/1] io_uring: Support Compare command for verification
commit: 6170d92a61da1a0e196352cc68888168c931edcd
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-09-26 17:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-26 1:08 [PATCH] io_uring: Support Compare command for verification Minwoo Im
2024-09-26 17:33 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox