Skip to content

Commit

Permalink
Merge branch 'nvme/support-sync-fua-for-iouring-v2' of https://github…
Browse files Browse the repository at this point in the history
….com/minwooim/fio

* 'nvme/support-sync-fua-for-iouring-v2' of https://github.com/minwooim/fio:
  io_uring: Add 'readfua' and 'writefua' options
  • Loading branch information
vincentkfu committed May 24, 2024
2 parents d3bcdd3 + 55e14d7 commit 85b5eb3
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 8 deletions.
4 changes: 2 additions & 2 deletions HOWTO.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2847,12 +2847,12 @@ with the caveat that when used on the command line, they must come after the
Specify stat system call type to measure lookup/getattr performance.
Default is **stat** for :manpage:`stat(2)`.

.. option:: readfua=bool : [sg]
.. option:: readfua=bool : [sg] [io_uring_cmd]

With readfua option set to 1, read operations include
the force unit access (fua) flag. Default is 0.

.. option:: writefua=bool : [sg]
.. option:: writefua=bool : [sg] [io_uring_cmd]

With writefua option set to 1, write operations include
the force unit access (fua) flag. Default is 0.
Expand Down
32 changes: 31 additions & 1 deletion engines/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,14 @@ struct ioring_data {
struct cmdprio cmdprio;

struct nvme_dsm *dsm;
uint32_t cdw12_flags[DDIR_RWDIR_CNT];
};

struct ioring_options {
struct thread_data *td;
unsigned int hipri;
unsigned int readfua;
unsigned int writefua;
struct cmdprio_options cmdprio_options;
unsigned int fixedbufs;
unsigned int registerfiles;
Expand Down Expand Up @@ -135,6 +138,26 @@ static struct fio_option options[] = {
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_IOURING,
},
{
.name = "readfua",
.lname = "Read fua flag support",
.type = FIO_OPT_BOOL,
.off1 = offsetof(struct ioring_options, readfua),
.help = "Set FUA flag (force unit access) for all Read operations",
.def = "0",
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_IOURING,
},
{
.name = "writefua",
.lname = "Write fua flag support",
.type = FIO_OPT_BOOL,
.off1 = offsetof(struct ioring_options, writefua),
.help = "Set FUA flag (force unit access) for all Write operations",
.def = "0",
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_IOURING,
},
{
.name = "fixedbufs",
.lname = "Fixed (pre-mapped) IO buffers",
Expand Down Expand Up @@ -432,7 +455,7 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)

return fio_nvme_uring_cmd_prep(cmd, io_u,
o->nonvectored ? NULL : &ld->iovecs[io_u->index],
dsm);
dsm, ld->cdw12_flags[io_u->ddir]);
}

static struct io_u *fio_ioring_event(struct thread_data *td, int event)
Expand Down Expand Up @@ -1219,6 +1242,13 @@ static int fio_ioring_init(struct thread_data *td)
}
}

if (!strcmp(td->io_ops->name, "io_uring_cmd")) {
if (o->readfua)
ld->cdw12_flags[DDIR_READ] = 1 << 30;
if (o->writefua)
ld->cdw12_flags[DDIR_WRITE] = 1 << 30;
}

return 0;
}

Expand Down
5 changes: 3 additions & 2 deletions engines/nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,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)
struct iovec *iov, struct nvme_dsm *dsm,
unsigned int cdw12_flags)
{
struct nvme_data *data = FILE_ENG_DATA(io_u->file);
__u64 slba;
Expand Down Expand Up @@ -391,7 +392,7 @@ int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
cmd->cdw10 = slba & 0xffffffff;
cmd->cdw11 = slba >> 32;
/* cdw12 represent number of lba's for read/write */
cmd->cdw12 = nlb | (io_u->dtype << 20);
cmd->cdw12 = nlb | (io_u->dtype << 20) | cdw12_flags;
cmd->cdw13 = io_u->dspec << 16;
if (iov) {
iov->iov_base = io_u->xfer_buf;
Expand Down
3 changes: 2 additions & 1 deletion engines/nvme.h
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,8 @@ int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, __u32 pi_act,
struct nvme_data *data);

int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
struct iovec *iov, struct nvme_dsm *dsm);
struct iovec *iov, struct nvme_dsm *dsm,
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);
Expand Down
4 changes: 2 additions & 2 deletions fio.1
Original file line number Diff line number Diff line change
Expand Up @@ -2632,11 +2632,11 @@ that "owns" the device also needs to support hipri (also known as iopoll
and mq_poll). The MegaRAID driver is an example of a SCSI LLD.
Default: clear (0) which does normal (interrupted based) IO.
.TP
.BI (sg)readfua \fR=\fPbool
.BI (sg, io_uring_cmd)readfua \fR=\fPbool
With readfua option set to 1, read operations include the force
unit access (fua) flag. Default: 0.
.TP
.BI (sg)writefua \fR=\fPbool
.BI (sg, io_uring_cmd)writefua \fR=\fPbool
With writefua option set to 1, write operations include the force
unit access (fua) flag. Default: 0.
.TP
Expand Down

0 comments on commit 85b5eb3

Please sign in to comment.