Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

io_uring: Add 'readfua' and 'writefua' options #1761

Merged
merged 1 commit into from
May 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions HOWTO.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2823,12 +2823,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 @@ -2602,11 +2602,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