From: Jens Axboe <axboe@kernel.dk>
To: <fio@vger.kernel.org>
Subject: Recent changes (master)
Date: Thu, 25 Jun 2026 06:00:01 -0600 [thread overview]
Message-ID: <20260625120001.5E2C71BC0156@kernel.dk> (raw)
The following changes since commit 2c69e8e9b67c0e8967cb1b9e67a74ef55ef9d027:
test: run QEMU tests on push and pull request (2026-06-23 16:36:52 -0400)
are available in the Git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to d72bcf71534b5ac82359e3b987ff109b0de57af0:
t/io_uring_cmd: better default for fio executable (2026-06-24 13:25:19 -0400)
----------------------------------------------------------------
Jungwon Lee (2):
engines/io_uring: Separate NVMe-specific logic
engines/io_uring: Add bsg support for io_uring_cmd engine
Kyoungrul Kim (1):
engines/sg: extract BE accessor helpers into shared sg.h
Vincent Fu (6):
Merge branch 'upstream-io_uring-bsg' of https://github.com/ljw8161/fio
engines/io_uring: add missing curly braces
t/io_uring_cmd: rename from t/nvmept.py
t/io_uring_cmd: support more cmd_types
t/io_uring_cmd: add a writefua/readfua test
t/io_uring_cmd: better default for fio executable
HOWTO.rst | 2 +-
Makefile | 5 +-
configure | 17 ++
engines/bsg.c | 169 ++++++++++++++
engines/bsg.h | 67 ++++++
engines/io_uring.c | 468 ++++++++++++++++++++++++++-------------
engines/sg.c | 37 +---
engines/sg.h | 47 ++++
examples/uring-cmd-bsg.fio | 31 +++
examples/uring-cmd-bsg.png | Bin 0 -> 146241 bytes
fio.1 | 2 +-
t/{nvmept.py => io_uring_cmd.py} | 43 +++-
t/run-fio-tests.py | 2 +-
13 files changed, 682 insertions(+), 208 deletions(-)
create mode 100644 engines/bsg.c
create mode 100644 engines/bsg.h
create mode 100644 engines/sg.h
create mode 100644 examples/uring-cmd-bsg.fio
create mode 100644 examples/uring-cmd-bsg.png
rename t/{nvmept.py => io_uring_cmd.py} (90%)
---
Diff of recent changes:
diff --git a/HOWTO.rst b/HOWTO.rst
index ac570972..ef079214 100644
--- a/HOWTO.rst
+++ b/HOWTO.rst
@@ -2564,7 +2564,7 @@ with the caveat that when used on the command line, they must come after the
.. option:: cmd_type=str : [io_uring_cmd]
Specifies the type of uring passthrough command to be used. Supported
- value is nvme. Default is nvme.
+ values are nvme and bsg. Default is nvme.
.. option:: hipri
diff --git a/Makefile b/Makefile
index e3960ece..4f87adba 100644
--- a/Makefile
+++ b/Makefile
@@ -218,7 +218,8 @@ ifdef CONFIG_LIBBLKIO
endif
ifeq ($(CONFIG_TARGET_OS), Linux)
SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c engines/sg.c \
- oslib/linux-dev-lookup.c engines/io_uring.c engines/nvme.c
+ oslib/linux-dev-lookup.c engines/io_uring.c engines/nvme.c \
+ engines/bsg.c
cmdprio_SRCS = engines/cmdprio.c
ifdef CONFIG_HAS_BLKZONED
SOURCE += oslib/linux-blkzoned.c
@@ -229,7 +230,7 @@ endif
ifeq ($(CONFIG_TARGET_OS), Android)
SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c profiles/tiobench.c \
oslib/linux-dev-lookup.c engines/io_uring.c engines/nvme.c \
- engines/sg.c
+ engines/sg.c engines/bsg.c
cmdprio_SRCS = engines/cmdprio.c
ifdef CONFIG_HAS_BLKZONED
SOURCE += oslib/linux-blkzoned.c
diff --git a/configure b/configure
index 664ce299..cdfefa59 100755
--- a/configure
+++ b/configure
@@ -2707,6 +2707,23 @@ fi
print_config "NVMe uring command support" "$nvme_uring_cmd"
fi
+##########################################
+# Check BSG_URING_CMD support
+cat > $TMPC << EOF
+#include <linux/bsg.h>
+int main(void)
+{
+ return sizeof(struct bsg_uring_cmd);
+}
+EOF
+if compile_prog "" "" "bsg uring cmd"; then
+ output_sym "CONFIG_BSG_URING_CMD"
+ bsg_uring_cmd="yes"
+else
+ bsg_uring_cmd="no"
+fi
+print_config "BSG uring command support" "$bsg_uring_cmd"
+
##########################################
# Check if we have xnvme
if test "$xnvme" != "no" ; then
diff --git a/engines/bsg.c b/engines/bsg.c
new file mode 100644
index 00000000..372212ef
--- /dev/null
+++ b/engines/bsg.c
@@ -0,0 +1,169 @@
+#include "bsg.h"
+
+int fio_bsg_uring_cmd_read_capacity(struct thread_data *td, unsigned int *bs,
+ unsigned long long *max_lba)
+{
+ struct sg_io_v4 hdr = { 0 };
+ unsigned long long hlba;
+ unsigned int blksz = 0;
+ unsigned char cmd[16];
+ unsigned char sb[64];
+ unsigned char buf[32];
+ int ret;
+ int fd = -1;
+
+ struct fio_file *f = td->files[0];
+
+ /* open file independent of rest of application */
+ fd = open(f->file_name, O_RDONLY);
+ if (fd < 0)
+ return -errno;
+
+ memset(cmd, 0, sizeof(cmd));
+ memset(sb, 0, sizeof(sb));
+ memset(buf, 0, sizeof(buf));
+
+ cmd[0] = bsg_cmd_read_capacity_10;
+ hdr.guard = 'Q';
+ hdr.protocol = 0;
+ hdr.subprotocol = 0;
+ hdr.response = (__u64)(uintptr_t) sb;
+ hdr.max_response_len = sizeof(sb);
+ hdr.request_len = sizeof(cmd);
+ hdr.request = (__u64)(uintptr_t) cmd;
+ hdr.din_xferp = (__u64)(uintptr_t) (buf);
+ hdr.din_xfer_len = sizeof(buf);
+
+ ret = ioctl(fd, SG_IO, &hdr);
+ if (ret < 0) {
+ close(fd);
+ return ret;
+ }
+
+ blksz = sgio_get_be32(&buf[4]);
+ hlba = sgio_get_be32(buf);
+
+ if (blksz) {
+ *bs = blksz;
+ *max_lba = hlba;
+ ret = 0;
+ } else {
+ ret = -EIO;
+ }
+
+ close(fd);
+ return ret;
+}
+
+int fio_bsg_uring_cmd_get_file_size(struct thread_data *td, struct fio_file *f)
+{
+ unsigned int bs = 0;
+ unsigned long long max_lba = 0;
+ int ret;
+
+ if (fio_file_size_known(f))
+ return 0;
+
+ if (f->filetype != FIO_TYPE_CHAR) {
+ td_verror(td, EINVAL, "wrong file type");
+ log_err("ioengine io_uring_cmd only works on character devices\n");
+ return 1;
+ }
+
+ ret = fio_bsg_uring_cmd_read_capacity(td, &bs, &max_lba);
+ if (ret) {
+ td_verror(td, td->error, "fio_bsg_uring_cmd_read_capacity");
+ log_err("ioengine io_uring_cmd unable to successfully execute "
+ "read capacity to get block size and maximum lba\n");
+ return 1;
+ }
+
+ f->real_file_size = (max_lba + 1) * bs;
+ fio_file_set_size_known(f);
+ return 0;
+}
+
+void fio_bsg_uring_cmd_init(struct bsg_uring_cmd *cmd, struct bsg_cmd *bc,
+ struct io_u *io_u, int dxfer_dir)
+{
+ memset(cmd, 0, sizeof(*cmd));
+ memset(bc->cdb, 0, sizeof(bc->cdb));
+
+ cmd->request = (uint64_t)(uintptr_t) bc->cdb;
+ cmd->request_len = sizeof(bc->cdb);
+ cmd->response = (uint64_t)(uintptr_t) bc->sb;
+ cmd->max_response_len = sizeof(bc->sb);
+
+ if (dxfer_dir == SG_DXFER_TO_DEV) {
+ cmd->dout_xferp = (uint64_t)(uintptr_t) io_u->xfer_buf;
+ cmd->dout_xfer_len = io_u->xfer_buflen;
+ } else {
+ cmd->din_xferp = (uint64_t)(uintptr_t) io_u->xfer_buf;
+ cmd->din_xfer_len = io_u->xfer_buflen;
+ }
+}
+
+static int fio_bsg_uring_cmd_rw_lba(struct bsg_cmd *bc, unsigned long long lba,
+ unsigned long long nlb)
+{
+ if (lba > MAX_10CDB_LBA || nlb > MAX_10CDB_NLB) {
+ log_err("offset or nlb is larger than the "
+ "maximum value of a field within CDB (10)\n");
+ return -EINVAL;
+ }
+ sgio_set_be32((uint32_t) lba, &bc->cdb[2]);
+ sgio_set_be16((uint16_t) nlb, &bc->cdb[7]);
+
+ return 0;
+}
+
+int fio_bsg_uring_cmd_prep(struct bsg_uring_cmd *cmd, struct io_u *io_u,
+ struct bsg_cmd *bc, bool fua)
+{
+ struct bsg_data *data = FILE_ENG_DATA(io_u->file);
+ unsigned long long offset, nlb;
+ int data_len;
+
+ if (io_u->xfer_buflen & (data->bs - 1)) {
+ log_err("read/write not sector aligned\n");
+ return -EINVAL;
+ }
+
+ offset = io_u->offset / data->bs;
+ nlb = io_u->xfer_buflen / data->bs;
+
+ switch (io_u->ddir) {
+ case DDIR_READ:
+ fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_FROM_DEV);
+ bc->cdb[0] = bsg_cmd_read_10;
+ if (fua)
+ bc->cdb[1] |= 1 << 3;
+ break;
+ case DDIR_WRITE:
+ fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_TO_DEV);
+ bc->cdb[0] = bsg_cmd_write_10;
+ if (fua)
+ bc->cdb[1] |= 1 << 3;
+ break;
+ case DDIR_TRIM:
+ fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_TO_DEV);
+ bc->cdb[0] = bsg_cmd_unmap;
+ data_len = sizeof(bc->unmap_param) / sizeof(bc->unmap_param[0]);
+ sgio_set_be16((uint16_t) data_len, &bc->cdb[7]);
+ sgio_set_be16((uint16_t) data_len - 2, &bc->unmap_param[0]);
+ sgio_set_be16((uint16_t) data_len - 8, &bc->unmap_param[2]);
+ sgio_set_be64(offset, &bc->unmap_param[8]);
+ sgio_set_be32((uint32_t) nlb, &bc->unmap_param[16]);
+ cmd->dout_xferp = (uint64_t)(uintptr_t) bc->unmap_param;
+ cmd->dout_xfer_len = data_len;
+ return 0;
+ case DDIR_SYNC:
+ fio_bsg_uring_cmd_init(cmd, bc, io_u, SG_DXFER_NONE);
+ bc->cdb[0] = bsg_cmd_sync_cache_10;
+ return 0;
+ default:
+ return -ENOTSUP;
+ }
+
+ return fio_bsg_uring_cmd_rw_lba(bc, offset, nlb);
+}
diff --git a/engines/bsg.h b/engines/bsg.h
new file mode 100644
index 00000000..6a4bfd07
--- /dev/null
+++ b/engines/bsg.h
@@ -0,0 +1,67 @@
+/*
+ * bsg structure declarations and helper functions for the
+ * io_uring_cmd engine.
+ */
+
+#ifndef FIO_BSG_H
+#define FIO_BSG_H
+
+#include <linux/bsg.h>
+#include <poll.h>
+#include "../fio.h"
+#include "sg.h"
+
+/*
+ * If the uapi headers installed on the system lacks bsg uring command
+ * support, use the local version to prevent compilation issues.
+ */
+#ifndef CONFIG_BSG_URING_CMD
+struct bsg_uring_cmd {
+ __u64 request;
+ __u32 request_len;
+ __u32 protocol;
+ __u32 subprotocol;
+ __u32 max_response_len;
+ __u64 response;
+ __u64 dout_xferp;
+ __u32 dout_xfer_len;
+ __u32 dout_iovec_count;
+ __u64 din_xferp;
+ __u32 din_xfer_len;
+ __u32 din_iovec_count;
+ __u32 timeout_ms;
+ __u8 reserved[12];
+};
+#endif /* CONFIG_BSG_URING_CMD */
+
+#define MAX_SB 64
+#define MAX_10CDB_LBA 0xFFFFFFFFULL
+#define MAX_10CDB_NLB 0xFFFFU
+
+enum bsg_io_opcode {
+ bsg_cmd_read_10 = 0x28,
+ bsg_cmd_read_capacity_10 = 0x25,
+ bsg_cmd_sync_cache_10 = 0x35,
+ bsg_cmd_unmap = 0x42,
+ bsg_cmd_write_10 = 0x2A,
+};
+
+struct bsg_cmd {
+ unsigned char cdb[16];
+ unsigned char sb[MAX_SB];
+ uint8_t unmap_param[24];
+};
+
+struct bsg_data {
+ unsigned int bs;
+};
+
+int fio_bsg_uring_cmd_read_capacity(struct thread_data *td, unsigned int *bs,
+ unsigned long long *max_lba);
+
+int fio_bsg_uring_cmd_get_file_size(struct thread_data *td, struct fio_file *f);
+
+int fio_bsg_uring_cmd_prep(struct bsg_uring_cmd *cmd, struct io_u *io_u,
+ struct bsg_cmd *bc, bool fua);
+
+#endif /* FIO_BSG_H */
diff --git a/engines/io_uring.c b/engines/io_uring.c
index 0db7abd6..bd50cdca 100644
--- a/engines/io_uring.c
+++ b/engines/io_uring.c
@@ -25,6 +25,7 @@
#include "cmdprio.h"
#include "zbd.h"
#include "nvme.h"
+#include "bsg.h"
#include <sys/stat.h>
@@ -95,6 +96,7 @@ struct logical_block_metadata_cap {
enum uring_cmd_type {
FIO_URING_CMD_NVME = 1,
+ FIO_URING_CMD_BSG,
};
enum uring_cmd_write_mode {
@@ -168,14 +170,19 @@ struct ioring_data {
struct cmdprio cmdprio;
- struct nvme_dsm *dsm;
- uint32_t cdw12_flags[DDIR_RWDIR_CNT];
uint8_t write_opcode;
struct frand_state wmode_state;
bool is_uring_cmd_eng;
+ /* NVMe */
+ struct nvme_dsm *dsm;
+ uint32_t cdw12_flags[DDIR_RWDIR_CNT];
struct nvme_cmd_ext_io_opts ext_opts;
+
+ /* BSG */
+ struct bsg_cmd *bc;
+ bool fua[DDIR_RWDIR_CNT];
};
struct ioring_options {
@@ -507,6 +514,10 @@ static struct fio_option options[] = {
.oval = FIO_URING_CMD_NVME,
.help = "Issue nvme-uring-cmd",
},
+ { .ival = "bsg",
+ .oval = FIO_URING_CMD_BSG,
+ .help = "Issue bsg-uring-cmd",
+ },
},
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_IOURING,
@@ -713,20 +724,48 @@ static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u)
return 0;
}
+static int fio_ioring_cmd_prep_write_split(struct thread_data *td,
+ struct nvme_uring_cmd *cmd,
+ struct io_u *io_u, struct iovec *iov)
+{
+ struct ioring_data *ld = td->io_ops_data;
+ struct ioring_options *o = td->eo;
+ unsigned int rand = rand_between(&ld->wmode_state, 0, 99);
+ unsigned int perc = 0;
+ int i;
+
+ for (i = 0; i < (int)o->wmode_split_nr; i++) {
+ perc += o->wmode_split[i].perc;
+ if (rand < perc) {
+ uint8_t op = o->wmode_split[i].opcode;
+
+ io_u_clear(td, io_u, IO_U_F_TRIMMED | IO_U_F_ZEROED | IO_U_F_ERRORED);
+ if (op == nvme_cmd_write_zeroes) {
+ if (o->deac)
+ io_u_set(td, io_u, IO_U_F_TRIMMED);
+ else
+ io_u_set(td, io_u, IO_U_F_ZEROED);
+ } else if (op == nvme_cmd_write_uncor) {
+ io_u_set(td, io_u, IO_U_F_ERRORED);
+ }
+
+ dprint(FD_IO, "op selected %u\n", op);
+ return fio_nvme_uring_cmd_prep(cmd, io_u, iov, NULL,
+ nvme_cmd_read, op, o->wmode_split[i].cdw12_flag);
+ }
+ }
+ return -EINVAL;
+}
+
static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
{
struct ioring_data *ld = td->io_ops_data;
struct ioring_options *o = td->eo;
struct fio_file *f = io_u->file;
- struct nvme_uring_cmd *cmd;
struct io_uring_sqe *sqe;
- 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)
+ /* only supports nvme_uring_cmd and bsg_uring_cmd */
+ if (o->cmd_type != FIO_URING_CMD_NVME && o->cmd_type != FIO_URING_CMD_BSG)
return -EINVAL;
if (io_u->ddir == DDIR_TRIM && td->io_ops->flags & FIO_ASYNCIO_SYNC_TRIM)
@@ -748,10 +787,6 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
sqe->opcode = IORING_OP_URING_CMD;
sqe->user_data = (unsigned long) io_u;
- if (o->nonvectored)
- sqe->cmd_op = NVME_URING_CMD_IO;
- else
- sqe->cmd_op = NVME_URING_CMD_IO_VEC;
if (o->force_async && ++ld->prepped == o->force_async) {
ld->prepped = 0;
sqe->flags |= IOSQE_ASYNC;
@@ -761,55 +796,51 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
sqe->buf_index = io_u->index;
}
- cmd = (struct nvme_uring_cmd *)sqe->cmd;
- dsm_size = sizeof(*ld->dsm) + td->o.num_range * sizeof(struct nvme_dsm_range);
- ptr += io_u->index * dsm_size;
- dsm = (struct nvme_dsm *)ptr;
+ if (o->cmd_type == FIO_URING_CMD_NVME) {
+ struct nvme_uring_cmd *cmd;
+ struct nvme_dsm *dsm;
+ void *ptr = ld->dsm;
+ unsigned int dsm_size;
+ uint8_t read_opcode = nvme_cmd_read;
+
+ if (o->nonvectored)
+ sqe->cmd_op = NVME_URING_CMD_IO;
+ else
+ sqe->cmd_op = NVME_URING_CMD_IO_VEC;
- /*
- * 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);
- }
+ cmd = (struct nvme_uring_cmd *)sqe->cmd;
+ dsm_size = sizeof(*ld->dsm) + td->o.num_range * sizeof(struct nvme_dsm_range);
+ ptr += io_u->index * dsm_size;
+ dsm = (struct nvme_dsm *)ptr;
- if (o->wmode_split_nr > 1 && io_u->ddir == DDIR_WRITE) {
- unsigned int rand = rand_between(&ld->wmode_state, 0, 99);
- unsigned int perc = 0;
- int i;
+ /*
+ * 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);
+ }
- for (i = 0; i < (int)o->wmode_split_nr; i++) {
- perc += o->wmode_split[i].perc;
- if (rand < perc) {
- uint8_t op = o->wmode_split[i].opcode;
+ if (o->wmode_split_nr > 1 && io_u->ddir == DDIR_WRITE) {
+ return fio_ioring_cmd_prep_write_split(td, cmd, io_u,
+ o->nonvectored ? NULL : &ld->iovecs[io_u->index]);
+ }
- io_u_clear(td, io_u, IO_U_F_TRIMMED | IO_U_F_ZEROED | IO_U_F_ERRORED);
- if (op == nvme_cmd_write_zeroes) {
- if (o->deac)
- io_u_set(td, io_u, IO_U_F_TRIMMED);
- else
- io_u_set(td, io_u, IO_U_F_ZEROED);
- } else if (op == nvme_cmd_write_uncor) {
- io_u_set(td, io_u, IO_U_F_ERRORED);
- }
+ return fio_nvme_uring_cmd_prep(cmd, io_u,
+ o->nonvectored ? NULL : &ld->iovecs[io_u->index],
+ dsm, read_opcode, ld->write_opcode,
+ ld->cdw12_flags[io_u->ddir]);
+ } else {
+ struct bsg_uring_cmd *cmd;
- dprint(FD_IO, "op selected %u\n", op);
- return fio_nvme_uring_cmd_prep(cmd, io_u,
- o->nonvectored ? NULL : &ld->iovecs[io_u->index],
- dsm, read_opcode, op,
- o->wmode_split[i].cdw12_flag);
- }
- }
- }
+ sqe->len = io_u->xfer_buflen;
+ cmd = (struct bsg_uring_cmd *)sqe->cmd;
- return fio_nvme_uring_cmd_prep(cmd, io_u,
- o->nonvectored ? NULL : &ld->iovecs[io_u->index],
- dsm, read_opcode, ld->write_opcode,
- ld->cdw12_flags[io_u->ddir]);
+ return fio_bsg_uring_cmd_prep(cmd, io_u, &ld->bc[io_u->index], ld->fua[io_u->ddir]);
+ }
}
static void fio_ioring_validate_md(struct thread_data *td, struct io_u *io_u)
@@ -873,7 +904,7 @@ static struct io_u *fio_ioring_cmd_event(struct thread_data *td, int event)
int ret;
index = (event + ld->cq_ring_off) & ld->cq_ring_mask;
- if (o->cmd_type == FIO_URING_CMD_NVME)
+ if (o->cmd_type == FIO_URING_CMD_NVME || o->cmd_type == FIO_URING_CMD_BSG)
index <<= 1;
cqe = &ld->cq_ring.cqes[index];
@@ -890,6 +921,17 @@ static struct io_u *fio_ioring_cmd_event(struct thread_data *td, int event)
if (ret)
io_u->error = ret;
}
+ } else if (o->cmd_type == FIO_URING_CMD_BSG) {
+ /*
+ * For bsg uring cmd, the big_cqe[0] in cqe contains the packed
+ * SCSI status, where bits 0-7 hold the device status and bits 16-23
+ * contaion the host status
+ */
+ ret = (cqe->big_cqe[0] >> 16) & 0xff;
+ if (ret)
+ io_u->error = -ret;
+ else
+ io_u->error = cqe->big_cqe[0] & 0xff;
}
ret:
@@ -909,8 +951,6 @@ static char *fio_ioring_cmd_errdetails(struct thread_data *td,
struct io_u *io_u)
{
struct ioring_options *o = td->eo;
- unsigned int sct = (io_u->error >> 8) & 0x7;
- unsigned int sc = io_u->error & 0xff;
#define MAXERRDETAIL 1024
#define MAXMSGCHUNK 128
char *msg, msgchunk[MAXMSGCHUNK];
@@ -925,6 +965,9 @@ static char *fio_ioring_cmd_errdetails(struct thread_data *td,
strlcat(msg, msgchunk, MAXERRDETAIL);
if (o->cmd_type == FIO_URING_CMD_NVME) {
+ unsigned int sct = (io_u->error >> 8) & 0x7;
+ unsigned int sc = io_u->error & 0xff;
+
strlcat(msg, "cq entry status (", MAXERRDETAIL);
snprintf(msgchunk, MAXMSGCHUNK, "sct=0x%02x; ", sct);
@@ -932,6 +975,17 @@ static char *fio_ioring_cmd_errdetails(struct thread_data *td,
snprintf(msgchunk, MAXMSGCHUNK, "sc=0x%02x)", sc);
strlcat(msg, msgchunk, MAXERRDETAIL);
+ } else if (o->cmd_type == FIO_URING_CMD_BSG) {
+ unsigned int status = io_u->error & 0xff;
+ unsigned int host_status = (io_u->error >> 16) & 0xff;
+ if (status) {
+ snprintf(msgchunk, MAXMSGCHUNK, "BSG SCSI Status: 0x%02x; ", status);
+ strlcat(msg, msgchunk, MAXERRDETAIL);
+ }
+ if (host_status) {
+ snprintf(msgchunk, MAXMSGCHUNK, "BSG Host Status: 0x%02x; ", host_status);
+ strlcat(msg, msgchunk, MAXERRDETAIL);
+ }
} else {
/* Print status code in generic */
snprintf(msgchunk, MAXMSGCHUNK, "status=0x%x", io_u->error);
@@ -1018,11 +1072,19 @@ static inline void fio_ioring_setup_pi(struct thread_data *td,
struct io_u *io_u)
{
struct ioring_data *ld = td->io_ops_data;
+ struct ioring_options *o = td->eo;
+ struct fio_file *f = io_u->file;
if (io_u->ddir == DDIR_TRIM)
return;
- fio_nvme_generate_guard(io_u, &ld->ext_opts);
+ if (o->cmd_type == FIO_URING_CMD_NVME) {
+ fio_nvme_generate_guard(io_u, &ld->ext_opts);
+ }
+ else {
+ td_verror(td, EINVAL, "wrong cmd_type");
+ log_err("%s: This cmd_type does not support generate_guard\n", f->file_name);
+ }
}
static inline void fio_ioring_cmdprio_prep(struct thread_data *td,
@@ -1220,6 +1282,7 @@ static void fio_ioring_cleanup(struct thread_data *td)
free(ld->iovecs);
free(ld->fds);
free(ld->dsm);
+ free(ld->bc);
free(ld);
}
}
@@ -1492,46 +1555,65 @@ static int fio_ioring_cmd_init(struct thread_data *td, struct ioring_data *ld)
{
struct ioring_options *o = td->eo;
- if (td_write(td)) {
- if (o->wmode_split_nr > 1) {
- int i;
-
- init_rand_seed(&ld->wmode_state,
- td->rand_seeds[FIO_RAND_WMODE_OFF],
- false);
- for (i = 0; i < (int)o->wmode_split_nr; i++) {
- struct wmode_split_entry *e = &o->wmode_split[i];
-
- e->cdw12_flag = 0;
- if (e->opcode == nvme_cmd_write_zeroes && o->deac)
- e->cdw12_flag = 1 << 25;
- else if (e->opcode == nvme_cmd_write && o->writefua)
- e->cdw12_flag = 1 << 30;
+ if (o->cmd_type == FIO_URING_CMD_NVME) {
+ if (td_write(td)) {
+ if (o->wmode_split_nr > 1) {
+ int i;
+
+ init_rand_seed(&ld->wmode_state,
+ td->rand_seeds[FIO_RAND_WMODE_OFF],
+ false);
+ for (i = 0; i < (int)o->wmode_split_nr; i++) {
+ struct wmode_split_entry *e = &o->wmode_split[i];
+
+ e->cdw12_flag = 0;
+ if (e->opcode == nvme_cmd_write_zeroes && o->deac)
+ e->cdw12_flag = 1 << 25;
+ else if (e->opcode == nvme_cmd_write && o->writefua)
+ e->cdw12_flag = 1 << 30;
+ }
+ } else {
+ switch (o->write_mode) {
+ case FIO_URING_CMD_WMODE_UNCOR:
+ ld->write_opcode = nvme_cmd_write_uncor;
+ break;
+ case FIO_URING_CMD_WMODE_ZEROES:
+ ld->write_opcode = nvme_cmd_write_zeroes;
+ if (o->deac)
+ ld->cdw12_flags[DDIR_WRITE] = 1 << 25;
+ break;
+ case FIO_URING_CMD_WMODE_VERIFY:
+ ld->write_opcode = nvme_cmd_verify;
+ break;
+ default:
+ ld->write_opcode = nvme_cmd_write;
+ break;
+ }
}
- } else {
- switch (o->write_mode) {
- case FIO_URING_CMD_WMODE_UNCOR:
- ld->write_opcode = nvme_cmd_write_uncor;
- break;
- case FIO_URING_CMD_WMODE_ZEROES:
- ld->write_opcode = nvme_cmd_write_zeroes;
- if (o->deac)
- ld->cdw12_flags[DDIR_WRITE] = 1 << 25;
- break;
- case FIO_URING_CMD_WMODE_VERIFY:
- ld->write_opcode = nvme_cmd_verify;
- break;
- default:
- ld->write_opcode = nvme_cmd_write;
- break;
+ }
+
+ if (o->readfua)
+ ld->cdw12_flags[DDIR_READ] = 1 << 30;
+ if (o->writefua && o->wmode_split_nr <= 1)
+ ld->cdw12_flags[DDIR_WRITE] = 1 << 30;
+ } else if (o->cmd_type == FIO_URING_CMD_BSG) {
+ ld->bc = calloc(td->o.iodepth, sizeof(struct bsg_cmd));
+
+ if (td_write(td)) {
+ if (o->write_mode == FIO_URING_CMD_WMODE_WRITE) {
+ ld->write_opcode = bsg_cmd_write_10;
+ } else {
+ log_err("Not Support Write mode in BSG io_uring_cmd\n");
+ td_verror(td, EINVAL, "fio_ioring_cmd_init");
+ return 1;
}
}
- }
- if (o->readfua)
- ld->cdw12_flags[DDIR_READ] = 1 << 30;
- if (o->writefua && o->wmode_split_nr <= 1)
- ld->cdw12_flags[DDIR_WRITE] = 1 << 30;
+ if (o->readfua)
+ ld->fua[DDIR_READ] = 1;
+ if (o->writefua)
+ ld->fua[DDIR_WRITE] = 1;
+ }
return 0;
}
@@ -1618,13 +1700,16 @@ static int fio_ioring_init(struct thread_data *td)
}
}
- parse_prchk_flags(o);
- ext_opts = &ld->ext_opts;
- if (o->pi_act)
- ext_opts->io_flags |= NVME_IO_PRINFO_PRACT;
- ext_opts->io_flags |= o->prchk;
- ext_opts->apptag = o->apptag;
- ext_opts->apptag_mask = o->apptag_mask;
+ if ((ld->is_uring_cmd_eng && o->cmd_type == FIO_URING_CMD_NVME) ||
+ !ld->is_uring_cmd_eng) {
+ parse_prchk_flags(o);
+ ext_opts = &ld->ext_opts;
+ if (o->pi_act)
+ ext_opts->io_flags |= NVME_IO_PRINFO_PRACT;
+ ext_opts->io_flags |= o->prchk;
+ ext_opts->apptag = o->apptag;
+ ext_opts->apptag_mask = o->apptag_mask;
+ }
ld->iovecs = calloc(ld->iodepth, sizeof(struct iovec));
@@ -1643,7 +1728,7 @@ static int fio_ioring_init(struct thread_data *td)
if (td_trim(td) && td->o.zone_mode == ZONE_MODE_ZBD &&
ld->is_uring_cmd_eng) {
td->io_ops->flags |= FIO_ASYNCIO_SYNC_TRIM;
- } else {
+ } else if (o->cmd_type == FIO_URING_CMD_NVME) {
dsm_size = sizeof(*ld->dsm);
dsm_size += td->o.num_range * sizeof(struct nvme_dsm_range);
ld->dsm = calloc(td->o.iodepth, dsm_size);
@@ -1664,8 +1749,7 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
{
struct ioring_data *ld = td->io_ops_data;
struct ioring_options *o = td->eo;
- struct nvme_pi_data *pi_data;
- char *p, *q;
+ char *p;
ld->io_u_index[io_u->index] = io_u;
@@ -1673,31 +1757,37 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
p += o->md_per_io_size * io_u->index;
io_u->mmap_data = p;
- if (ld->pi_attr) {
- struct io_uring_attr_pi *pi_attr;
-
- q = ld->pi_attr;
- q += (sizeof(struct io_uring_attr_pi) * io_u->index);
- io_u->pi_attr = q;
-
- pi_attr = io_u->pi_attr;
- pi_attr->len = o->md_per_io_size;
- pi_attr->app_tag = o->apptag;
- pi_attr->flags = 0;
- if (o->prchk & NVME_IO_PRINFO_PRCHK_GUARD)
- pi_attr->flags |= IO_INTEGRITY_CHK_GUARD;
- if (o->prchk & NVME_IO_PRINFO_PRCHK_REF)
- pi_attr->flags |= IO_INTEGRITY_CHK_REFTAG;
- if (o->prchk & NVME_IO_PRINFO_PRCHK_APP)
- pi_attr->flags |= IO_INTEGRITY_CHK_APPTAG;
- }
+ if ((ld->is_uring_cmd_eng && o->cmd_type == FIO_URING_CMD_NVME) ||
+ !ld->is_uring_cmd_eng) {
+ struct nvme_pi_data *pi_data;
+ char *q;
+
+ if (ld->pi_attr) {
+ struct io_uring_attr_pi *pi_attr;
+
+ q = ld->pi_attr;
+ q += (sizeof(struct io_uring_attr_pi) * io_u->index);
+ io_u->pi_attr = q;
+
+ pi_attr = io_u->pi_attr;
+ pi_attr->len = o->md_per_io_size;
+ pi_attr->app_tag = o->apptag;
+ pi_attr->flags = 0;
+ if (o->prchk & NVME_IO_PRINFO_PRCHK_GUARD)
+ pi_attr->flags |= IO_INTEGRITY_CHK_GUARD;
+ if (o->prchk & NVME_IO_PRINFO_PRCHK_REF)
+ pi_attr->flags |= IO_INTEGRITY_CHK_REFTAG;
+ if (o->prchk & NVME_IO_PRINFO_PRCHK_APP)
+ pi_attr->flags |= IO_INTEGRITY_CHK_APPTAG;
+ }
- if (!o->pi_act) {
- pi_data = calloc(1, sizeof(*pi_data));
- pi_data->io_flags |= o->prchk;
- pi_data->apptag_mask = o->apptag_mask;
- pi_data->apptag = o->apptag;
- io_u->engine_data = pi_data;
+ if (!o->pi_act) {
+ pi_data = calloc(1, sizeof(*pi_data));
+ pi_data->io_flags |= o->prchk;
+ pi_data->apptag_mask = o->apptag_mask;
+ pi_data->apptag = o->apptag;
+ io_u->engine_data = pi_data;
+ }
}
if (ld->is_uring_cmd_eng && o->wmode_split_nr <= 1) {
@@ -1716,9 +1806,7 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
static void fio_ioring_io_u_free(struct thread_data *td, struct io_u *io_u)
{
- struct nvme_pi *pi = io_u->engine_data;
-
- free(pi);
+ free(io_u->engine_data);
io_u->engine_data = NULL;
}
@@ -1922,6 +2010,22 @@ static int fio_ioring_cmd_open_file(struct thread_data *td, struct fio_file *f)
ret = fio_ioring_open_nvme(td, f);
if (ret)
return ret;
+ } else if (o->cmd_type == FIO_URING_CMD_BSG) {
+ struct bsg_data *data;
+ unsigned int bs = 0;
+ unsigned long long last_lba = 0;
+ int ret;
+
+ data = FILE_ENG_DATA(f);
+ if (data == NULL) {
+ ret = fio_bsg_uring_cmd_read_capacity(td, &bs, &last_lba);
+ if (ret) {
+ return ret;
+ }
+ data = calloc(1, sizeof(struct bsg_data));
+ data->bs = bs;
+ FILE_SET_ENG_DATA(f, data);
+ }
}
return fio_ioring_open_file(td, f);
@@ -1944,11 +2048,11 @@ static int fio_ioring_cmd_close_file(struct thread_data *td,
{
struct ioring_options *o = td->eo;
- if (o->cmd_type == FIO_URING_CMD_NVME) {
- struct nvme_data *data = FILE_ENG_DATA(f);
-
+ if (o->cmd_type == FIO_URING_CMD_NVME || o->cmd_type == FIO_URING_CMD_BSG) {
+ free(FILE_ENG_DATA(f));
FILE_SET_ENG_DATA(f, NULL);
- free(data);
+ } else {
+ log_err("%s: This cmd_type does not support\n", f->file_name);
}
return fio_ioring_close_file(td, f);
@@ -1980,6 +2084,25 @@ static int fio_ioring_cmd_get_file_size(struct thread_data *td,
f->real_file_size = data->lba_size * nlba;
fio_file_set_size_known(f);
+ FILE_SET_ENG_DATA(f, data);
+ return 0;
+ } else if (o->cmd_type == FIO_URING_CMD_BSG) {
+ struct bsg_data *data = NULL;
+ unsigned int bs = 0;
+ unsigned long long last_lba = 0;
+ int ret;
+
+ ret = fio_bsg_uring_cmd_read_capacity(td, &bs, &last_lba);
+ if (ret) {
+ return ret;
+ }
+
+ f->real_file_size = (last_lba + 1) * bs;
+ fio_file_set_size_known(f);
+
+ data = calloc(1, sizeof(struct bsg_data));
+ data->bs = bs;
+
FILE_SET_ENG_DATA(f, data);
return 0;
}
@@ -2031,7 +2154,14 @@ static int fio_ioring_cmd_get_zoned_model(struct thread_data *td,
struct fio_file *f,
enum zbd_zoned_model *model)
{
- return fio_nvme_get_zoned_model(td, f, model);
+ struct ioring_options *o = td->eo;
+
+ if (o->cmd_type == FIO_URING_CMD_NVME)
+ return fio_nvme_get_zoned_model(td, f, model);
+
+ td_verror(td, EINVAL, "wrong cmd_type");
+ log_err("%s: This cmd_type does not support get_zoned_model\n", f->file_name);
+ return -EINVAL;
}
static int fio_ioring_cmd_report_zones(struct thread_data *td,
@@ -2039,45 +2169,73 @@ static int fio_ioring_cmd_report_zones(struct thread_data *td,
struct zbd_zone *zbdz,
unsigned int nr_zones)
{
- return fio_nvme_report_zones(td, f, offset, zbdz, nr_zones);
+ struct ioring_options *o = td->eo;
+
+ if (o->cmd_type == FIO_URING_CMD_NVME)
+ return fio_nvme_report_zones(td, f, offset, zbdz, nr_zones);
+
+ td_verror(td, EINVAL, "wrong cmd_type");
+ log_err("%s: This cmd_type does not support report_zones\n", f->file_name);
+ return -EINVAL;
}
static int fio_ioring_cmd_reset_wp(struct thread_data *td, struct fio_file *f,
uint64_t offset, uint64_t length)
{
- return fio_nvme_reset_wp(td, f, offset, length);
+ struct ioring_options *o = td->eo;
+
+ if (o->cmd_type == FIO_URING_CMD_NVME)
+ return fio_nvme_reset_wp(td, f, offset, length);
+
+ td_verror(td, EINVAL, "wrong cmd_type");
+ log_err("%s: This cmd_type does not support reset_wp\n", f->file_name);
+ return -EINVAL;
}
static int fio_ioring_cmd_get_max_open_zones(struct thread_data *td,
struct fio_file *f,
unsigned int *max_open_zones)
{
- return fio_nvme_get_max_open_zones(td, f, max_open_zones);
+ struct ioring_options *o = td->eo;
+
+ if (o->cmd_type == FIO_URING_CMD_NVME)
+ return fio_nvme_get_max_open_zones(td, f, max_open_zones);
+
+ td_verror(td, EINVAL, "wrong cmd_type");
+ log_err("%s: This cmd_type does not support get_max_open_zones\n", f->file_name);
+ return -EINVAL;
}
static int fio_ioring_cmd_fetch_ruhs(struct thread_data *td, struct fio_file *f,
struct fio_ruhs_info *fruhs_info)
{
+ struct ioring_options *o = td->eo;
struct nvme_fdp_ruh_status *ruhs;
int bytes, nr_ruhs, ret, i;
- nr_ruhs = fruhs_info->nr_ruhs;
- bytes = sizeof(*ruhs) + fruhs_info->nr_ruhs * sizeof(struct nvme_fdp_ruh_status_desc);
+ if (o->cmd_type == FIO_URING_CMD_NVME) {
+ nr_ruhs = fruhs_info->nr_ruhs;
+ bytes = sizeof(*ruhs) + fruhs_info->nr_ruhs * sizeof(struct nvme_fdp_ruh_status_desc);
- ruhs = calloc(1, bytes);
- if (!ruhs)
- return -ENOMEM;
+ ruhs = calloc(1, bytes);
+ if (!ruhs)
+ return -ENOMEM;
- ret = fio_nvme_iomgmt_ruhs(td, f, ruhs, bytes);
- if (ret)
- goto free;
+ ret = fio_nvme_iomgmt_ruhs(td, f, ruhs, bytes);
+ if (ret)
+ goto free;
- fruhs_info->nr_ruhs = le16_to_cpu(ruhs->nruhsd);
- for (i = 0; i < nr_ruhs; i++)
- fruhs_info->plis[i] = le16_to_cpu(ruhs->ruhss[i].pid);
-free:
- free(ruhs);
- return ret;
+ fruhs_info->nr_ruhs = le16_to_cpu(ruhs->nruhsd);
+ for (i = 0; i < nr_ruhs; i++)
+ fruhs_info->plis[i] = le16_to_cpu(ruhs->ruhss[i].pid);
+ free:
+ free(ruhs);
+ return ret;
+ }
+
+ td_verror(td, EINVAL, "wrong cmd_type");
+ log_err("%s: This cmd_type does not support fetch_ruhs\n", f->file_name);
+ return -EINVAL;
}
static struct ioengine_ops ioengine_uring = {
diff --git a/engines/sg.c b/engines/sg.c
index 7912e9c8..bd81af78 100644
--- a/engines/sg.c
+++ b/engines/sg.c
@@ -57,6 +57,7 @@
#include "../fio.h"
#include "../optgroup.h"
+#include "sg.h"
#ifdef FIO_HAVE_SGIO
@@ -217,42 +218,6 @@ struct sgio_data {
#endif
};
-static inline uint16_t sgio_get_be16(uint8_t *buf)
-{
- return be16_to_cpu(*((uint16_t *) buf));
-}
-
-static inline uint32_t sgio_get_be32(uint8_t *buf)
-{
- return be32_to_cpu(*((uint32_t *) buf));
-}
-
-static inline uint64_t sgio_get_be64(uint8_t *buf)
-{
- return be64_to_cpu(*((uint64_t *) buf));
-}
-
-static inline void sgio_set_be16(uint16_t val, uint8_t *buf)
-{
- uint16_t t = cpu_to_be16(val);
-
- memcpy(buf, &t, sizeof(uint16_t));
-}
-
-static inline void sgio_set_be32(uint32_t val, uint8_t *buf)
-{
- uint32_t t = cpu_to_be32(val);
-
- memcpy(buf, &t, sizeof(uint32_t));
-}
-
-static inline void sgio_set_be64(uint64_t val, uint8_t *buf)
-{
- uint64_t t = cpu_to_be64(val);
-
- memcpy(buf, &t, sizeof(uint64_t));
-}
-
static inline bool sgio_unbuffered(struct thread_data *td)
{
return (td->o.odirect || td->o.sync_io);
diff --git a/engines/sg.h b/engines/sg.h
new file mode 100644
index 00000000..957e0f26
--- /dev/null
+++ b/engines/sg.h
@@ -0,0 +1,47 @@
+/*
+ * Shared inline helpers for SCSI byte-order accessors, used by both the
+ * sg and bsg/io_uring_cmd engines.
+ */
+
+#ifndef FIO_SG_H
+#define FIO_SG_H
+
+#include "../fio.h"
+
+static inline uint16_t sgio_get_be16(uint8_t *buf)
+{
+ return be16_to_cpu(*((uint16_t *) buf));
+}
+
+static inline uint32_t sgio_get_be32(uint8_t *buf)
+{
+ return be32_to_cpu(*((uint32_t *) buf));
+}
+
+static inline uint64_t sgio_get_be64(uint8_t *buf)
+{
+ return be64_to_cpu(*((uint64_t *) buf));
+}
+
+static inline void sgio_set_be16(uint16_t val, uint8_t *buf)
+{
+ uint16_t t = cpu_to_be16(val);
+
+ memcpy(buf, &t, sizeof(uint16_t));
+}
+
+static inline void sgio_set_be32(uint32_t val, uint8_t *buf)
+{
+ uint32_t t = cpu_to_be32(val);
+
+ memcpy(buf, &t, sizeof(uint32_t));
+}
+
+static inline void sgio_set_be64(uint64_t val, uint8_t *buf)
+{
+ uint64_t t = cpu_to_be64(val);
+
+ memcpy(buf, &t, sizeof(uint64_t));
+}
+
+#endif /* FIO_SG_H */
diff --git a/examples/uring-cmd-bsg.fio b/examples/uring-cmd-bsg.fio
new file mode 100644
index 00000000..d3d5f615
--- /dev/null
+++ b/examples/uring-cmd-bsg.fio
@@ -0,0 +1,31 @@
+# io_uring_cmd I/O engine for block SCSI generic character device
+
+[global]
+filename=/dev/bsg/0\:0\:0\:0
+ioengine=io_uring_cmd
+cmd_type=bsg
+size=1G
+iodepth=32
+bs=4KB
+stonewall=1
+
+[rand-write]
+rw=randwrite
+
+[rand-read]
+rw=randread
+
+[trimwrite]
+rw=trimwrite
+
+[writefua]
+rw=write
+writefua=1
+
+[readfua]
+rw=read
+readfua=1
+
+[fsync]
+rw=write
+fsync=1
diff --git a/examples/uring-cmd-bsg.png b/examples/uring-cmd-bsg.png
new file mode 100644
index 00000000..4202d3a2
Binary files /dev/null and b/examples/uring-cmd-bsg.png differ
diff --git a/fio.1 b/fio.1
index d2933a8f..bdb7662d 100644
--- a/fio.1
+++ b/fio.1
@@ -2347,7 +2347,7 @@ should be used for the polling thread.
.TP
.BI (io_uring_cmd)cmd_type \fR=\fPstr
Specifies the type of uring passthrough command to be used. Supported
-value is nvme. Default is nvme.
+values are nvme and bsg. Default is nvme.
.TP
.BI (libaio)userspace_reap
Normally, with the libaio engine in use, fio will use the
diff --git a/t/nvmept.py b/t/io_uring_cmd.py
similarity index 90%
rename from t/nvmept.py
rename to t/io_uring_cmd.py
index 3d90f4bf..a53f5627 100755
--- a/t/nvmept.py
+++ b/t/io_uring_cmd.py
@@ -1,15 +1,15 @@
#!/usr/bin/env python3
"""
-# nvmept.py
+# io_uring_cmd.py
#
# Test fio's io_uring_cmd ioengine with NVMe pass-through commands.
#
# USAGE
-# see python3 nvmept.py --help
+# see python3 io_uring_cmd.py --help
#
# EXAMPLES
-# python3 t/nvmept.py --dut /dev/ng0n1
-# python3 t/nvmept.py --dut /dev/ng1n1 -f ./fio
+# python3 t/io_uring_cmd.py --dut /dev/ng0n1
+# python3 t/io_uring_cmd.py --dut /dev/ng1n1 -f ./fio
#
# REQUIREMENTS
# Python 3.6
@@ -33,12 +33,12 @@ class PassThruTest(FioJobCmdTest):
"""Setup a test."""
fio_args = [
- "--name=nvmept",
+ "--name=io_uring_cmd",
"--ioengine=io_uring_cmd",
- "--cmd_type=nvme",
"--iodepth=8",
"--iodepth_batch=4",
"--iodepth_batch_complete=4",
+ f"--cmd_type={self.fio_opts['cmd_type']}",
f"--filename={self.fio_opts['filename']}",
f"--rw={self.fio_opts['rw']}",
f"--output={self.filenames['output']}",
@@ -46,7 +46,8 @@ class PassThruTest(FioJobCmdTest):
]
for opt in ['fixedbufs', 'nonvectored', 'force_async', 'registerfiles',
'sqthread_poll', 'sqthread_poll_cpu', 'hipri', 'nowait',
- 'time_based', 'runtime', 'verify', 'io_size']:
+ 'time_based', 'runtime', 'verify', 'io_size', 'readfua',
+ 'writefua', ]:
if opt in self.fio_opts:
option = f"--{opt}={self.fio_opts[opt]}"
fio_args.append(option)
@@ -90,10 +91,10 @@ class PassThruTest(FioJobCmdTest):
class FlushTest(FioJobCmdTest):
def setup(self, parameters):
fio_args = [
- "--name=nvmept-flush",
+ "--name=io_uring_cmd-flush",
"--ioengine=io_uring_cmd",
- "--cmd_type=nvme",
"--randrepeat=0",
+ f"--cmd_type={self.fio_opts['cmd_type']}",
f"--filename={self.fio_opts['filename']}",
f"--rw={self.fio_opts['rw']}",
f"--output={self.filenames['output']}",
@@ -346,6 +347,21 @@ TEST_LIST = [
},
"test_class": FlushTest,
},
+ #
+ # Run a test with writefua and readfua
+ #
+ {
+ "test_id": 20,
+ "fio_opts": {
+ "rw": 'randrw',
+ "writefua": 1,
+ "readfua": 1,
+ "timebased": 1,
+ "runtime": 3,
+ "output-format": "json",
+ },
+ "test_class": PassThruTest,
+ },
]
def parse_args():
@@ -360,6 +376,8 @@ def parse_args():
help='list of test(s) to run, skipping all others')
parser.add_argument('--dut', help='target NVMe character device to test '
'(e.g., /dev/ng0n1). WARNING: THIS IS A DESTRUCTIVE TEST', required=True)
+ parser.add_argument('-c', '--cmd_type', help='cmd_type for io_uring_cmd',
+ default='nvme')
args = parser.parse_args()
return args
@@ -371,24 +389,25 @@ def main():
args = parse_args()
artifact_root = args.artifact_root if args.artifact_root else \
- f"nvmept-test-{time.strftime('%Y%m%d-%H%M%S')}"
+ f"io_uring_cmd-test-{time.strftime('%Y%m%d-%H%M%S')}"
os.mkdir(artifact_root)
print(f"Artifact directory is {artifact_root}")
if args.fio:
fio_path = str(Path(args.fio).absolute())
else:
- fio_path = 'fio'
+ fio_path = os.path.join(str(Path(__file__).absolute().parent.parent), "fio")
print(f"fio path is {fio_path}")
for test in TEST_LIST:
test['fio_opts']['filename'] = args.dut
+ test['fio_opts']['cmd_type'] = args.cmd_type
test_env = {
'fio_path': fio_path,
'fio_root': str(Path(__file__).absolute().parent.parent),
'artifact_root': artifact_root,
- 'basename': 'nvmept',
+ 'basename': 'io_uring_cmd',
}
_, failed, _ = run_fio_tests(TEST_LIST, test_env, args)
diff --git a/t/run-fio-tests.py b/t/run-fio-tests.py
index 35790120..aef2d026 100755
--- a/t/run-fio-tests.py
+++ b/t/run-fio-tests.py
@@ -1086,7 +1086,7 @@ TEST_LIST = [
{
'test_id': 1014,
'test_class': FioExeTest,
- 'exe': 't/nvmept.py',
+ 'exe': 't/io_uring_cmd.py',
'parameters': ['-f', '{fio_path}', '--dut', '{nvmecdev}'],
'success': SUCCESS_DEFAULT,
'requirements': [Requirements.linux, Requirements.nvmecdev],
next reply other threads:[~2026-06-25 12:00 UTC|newest]
Thread overview: 1530+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-25 12:00 Jens Axboe [this message]
-- strict thread matches above, loose matches on Subject: below --
2026-07-16 12:00 Recent changes (master) Jens Axboe
2026-07-08 12:00 Jens Axboe
2026-07-03 12:00 Jens Axboe
2026-07-01 12:00 Jens Axboe
2026-06-27 12:00 Jens Axboe
2026-06-26 12:00 Jens Axboe
2026-06-24 12:00 Jens Axboe
2026-06-16 12:00 Jens Axboe
2026-06-14 12:00 Jens Axboe
2026-06-12 12:00 Jens Axboe
2026-06-11 12:00 Jens Axboe
2026-06-10 12:00 Jens Axboe
2026-06-09 12:00 Jens Axboe
2026-06-06 12:00 Jens Axboe
2026-06-03 12:00 Jens Axboe
2026-06-02 12:00 Jens Axboe
2026-05-29 12:00 Jens Axboe
2026-05-21 12:00 Jens Axboe
2026-05-16 12:00 Jens Axboe
2026-05-13 12:00 Jens Axboe
2026-05-01 12:00 Jens Axboe
2026-04-29 12:00 Jens Axboe
2026-04-23 12:00 Jens Axboe
2026-04-18 12:00 Jens Axboe
2026-04-17 12:00 Jens Axboe
2026-04-08 12:00 Jens Axboe
2026-04-07 12:00 Jens Axboe
2026-04-02 12:00 Jens Axboe
2026-03-19 12:00 Jens Axboe
2026-03-17 12:00 Jens Axboe
2026-03-11 12:00 Jens Axboe
2026-03-10 12:00 Jens Axboe
2026-03-04 13:00 Jens Axboe
2026-03-03 13:00 Jens Axboe
2026-03-02 13:00 Jens Axboe
2026-02-25 13:00 Jens Axboe
2026-02-14 13:00 Jens Axboe
2026-02-10 13:00 Jens Axboe
2026-02-09 13:00 Jens Axboe
2026-02-06 13:00 Jens Axboe
2026-02-03 13:00 Jens Axboe
2026-01-31 13:00 Jens Axboe
2026-01-28 13:00 Jens Axboe
2026-01-24 13:00 Jens Axboe
2026-01-21 13:00 Jens Axboe
2026-01-17 13:00 Jens Axboe
2026-01-16 13:00 Jens Axboe
2026-01-12 13:00 Jens Axboe
2026-01-08 13:00 Jens Axboe
2025-12-30 13:00 Jens Axboe
2025-12-19 13:00 Jens Axboe
2025-12-17 13:00 Jens Axboe
2025-12-14 13:00 Jens Axboe
2025-12-11 13:00 Jens Axboe
2025-12-09 13:00 Jens Axboe
2025-11-25 13:00 Jens Axboe
2025-11-19 13:00 Jens Axboe
2025-11-18 13:00 Jens Axboe
2025-11-15 13:00 Jens Axboe
2025-11-06 13:00 Jens Axboe
2025-11-01 12:00 Jens Axboe
2025-10-31 12:00 Jens Axboe
2025-10-30 12:00 Jens Axboe
2025-10-29 12:00 Jens Axboe
2025-10-16 12:00 Jens Axboe
2025-10-11 12:00 Jens Axboe
2025-10-10 12:00 Jens Axboe
2025-10-09 12:00 Jens Axboe
2025-10-06 12:00 Jens Axboe
2025-10-05 12:00 Jens Axboe
2025-10-02 12:00 Jens Axboe
2025-09-26 12:00 Jens Axboe
2025-09-24 12:00 Jens Axboe
2025-09-19 12:00 Jens Axboe
2025-09-18 12:00 Jens Axboe
2025-09-17 12:00 Jens Axboe
2025-09-09 12:00 Jens Axboe
2025-09-06 12:00 Jens Axboe
2025-09-05 12:00 Jens Axboe
2025-09-04 12:00 Jens Axboe
2025-08-27 12:00 Jens Axboe
2025-08-26 12:00 Jens Axboe
2025-08-23 12:00 Jens Axboe
2025-08-22 12:00 Jens Axboe
2025-08-21 12:00 Jens Axboe
2025-08-20 12:00 Jens Axboe
2025-08-19 12:00 Jens Axboe
2025-08-12 12:00 Jens Axboe
2025-08-10 12:00 Jens Axboe
2025-08-08 12:00 Jens Axboe
2025-08-06 12:00 Jens Axboe
2025-08-03 12:00 Jens Axboe
2025-08-01 12:00 Jens Axboe
2025-07-24 12:00 Jens Axboe
2025-07-23 12:00 Jens Axboe
2025-07-19 12:00 Jens Axboe
2025-07-17 12:00 Jens Axboe
2025-07-10 12:00 Jens Axboe
2025-07-09 12:00 Jens Axboe
2025-07-01 12:00 Jens Axboe
2025-06-24 12:00 Jens Axboe
2025-06-05 12:00 Jens Axboe
2025-06-03 12:00 Jens Axboe
2025-06-01 12:00 Jens Axboe
2025-05-24 12:00 Jens Axboe
2025-05-21 12:00 Jens Axboe
2025-05-17 12:00 Jens Axboe
2025-05-14 12:00 Jens Axboe
2025-05-10 12:00 Jens Axboe
2025-05-09 12:00 Jens Axboe
2025-05-08 12:00 Jens Axboe
2025-05-07 12:00 Jens Axboe
2025-04-16 12:00 Jens Axboe
2025-04-15 12:00 Jens Axboe
2025-04-08 12:00 Jens Axboe
2025-04-05 12:00 Jens Axboe
2025-03-20 12:00 Jens Axboe
2025-03-19 12:00 Jens Axboe
2025-03-08 13:00 Jens Axboe
2025-03-07 13:00 Jens Axboe
2025-03-06 13:00 Jens Axboe
2025-02-21 13:00 Jens Axboe
2025-02-19 13:00 Jens Axboe
2025-02-18 13:00 Jens Axboe
2025-02-15 13:00 Jens Axboe
2025-02-14 13:00 Jens Axboe
2025-01-31 13:00 Jens Axboe
2025-01-24 13:00 Jens Axboe
2025-01-23 13:00 Jens Axboe
2025-01-22 13:00 Jens Axboe
2024-12-17 13:00 Jens Axboe
2024-12-10 13:00 Jens Axboe
2024-12-05 13:00 Jens Axboe
2024-11-23 13:00 Jens Axboe
2024-11-06 13:00 Jens Axboe
2024-11-05 13:00 Jens Axboe
2024-10-29 12:00 Jens Axboe
2024-10-17 12:00 Jens Axboe
2024-10-09 12:00 Jens Axboe
2024-10-04 12:00 Jens Axboe
2024-10-03 12:00 Jens Axboe
2024-10-01 12:00 Jens Axboe
2024-09-28 12:00 Jens Axboe
2024-09-27 12:00 Jens Axboe
2024-09-17 12:00 Jens Axboe
2024-09-07 12:00 Jens Axboe
2024-09-06 12:00 Jens Axboe
2024-09-05 12:00 Jens Axboe
2024-09-04 12:00 Jens Axboe
2024-08-30 12:00 Jens Axboe
2024-08-29 12:00 Jens Axboe
2024-08-22 12:00 Jens Axboe
2024-08-17 12:00 Jens Axboe
2024-08-07 12:00 Jens Axboe
2024-08-06 12:00 Jens Axboe
2024-07-27 12:00 Jens Axboe
2024-07-18 12:00 Jens Axboe
2024-07-16 12:00 Jens Axboe
2024-07-13 12:00 Jens Axboe
2024-07-12 12:00 Jens Axboe
2024-06-29 12:00 Jens Axboe
2024-06-15 12:00 Jens Axboe
2024-06-13 12:00 Jens Axboe
2024-06-13 12:00 Jens Axboe
2024-06-12 12:00 Jens Axboe
2024-06-08 12:00 Jens Axboe
2024-06-07 12:00 Jens Axboe
2024-06-05 12:00 Jens Axboe
2024-06-04 12:00 Jens Axboe
2024-06-04 12:11 ` Niklas Cassel
2024-06-04 12:53 ` Vincent Fu
2024-06-01 12:00 Jens Axboe
2024-05-29 12:00 Jens Axboe
2024-05-25 12:00 Jens Axboe
2024-05-22 12:00 Jens Axboe
2024-05-01 12:00 Jens Axboe
2024-04-26 12:00 Jens Axboe
2024-04-25 12:00 Jens Axboe
2024-04-20 12:00 Jens Axboe
2024-04-19 12:00 Jens Axboe
2024-04-18 12:00 Jens Axboe
2024-04-17 12:00 Jens Axboe
2024-04-16 12:00 Jens Axboe
2024-04-03 12:00 Jens Axboe
2024-03-27 12:00 Jens Axboe
2024-03-26 12:00 Jens Axboe
2024-03-23 12:00 Jens Axboe
2024-03-22 12:00 Jens Axboe
2024-03-21 12:00 Jens Axboe
2024-03-19 12:00 Jens Axboe
2024-03-08 13:00 Jens Axboe
2024-03-06 13:00 Jens Axboe
2024-03-05 13:00 Jens Axboe
2024-02-28 13:00 Jens Axboe
2024-02-23 13:00 Jens Axboe
2024-02-17 13:00 Jens Axboe
2024-02-16 13:00 Jens Axboe
2024-02-15 13:00 Jens Axboe
2024-02-14 13:00 Jens Axboe
2024-02-13 13:00 Jens Axboe
2024-02-09 13:00 Jens Axboe
2024-02-08 13:00 Jens Axboe
2024-01-28 13:00 Jens Axboe
2024-01-26 13:00 Jens Axboe
2024-01-25 13:00 Jens Axboe
2024-01-24 13:00 Jens Axboe
2024-01-23 13:00 Jens Axboe
2024-01-19 13:00 Jens Axboe
2024-01-18 13:00 Jens Axboe
2024-01-18 13:00 Jens Axboe
2024-01-17 13:00 Jens Axboe
2023-12-30 13:00 Jens Axboe
2023-12-20 13:00 Jens Axboe
2023-12-16 13:00 Jens Axboe
2023-12-15 13:00 Jens Axboe
2023-12-13 13:00 Jens Axboe
2023-12-12 13:00 Jens Axboe
2023-11-20 13:00 Jens Axboe
2023-11-08 13:00 Jens Axboe
2023-11-07 13:00 Jens Axboe
2023-11-04 12:00 Jens Axboe
2023-11-03 12:00 Jens Axboe
2023-11-01 12:00 Jens Axboe
2023-10-26 12:00 Jens Axboe
2023-10-24 12:00 Jens Axboe
2023-10-23 12:00 Jens Axboe
2023-10-20 12:00 Jens Axboe
2023-10-17 12:00 Jens Axboe
2023-10-14 12:00 Jens Axboe
2023-10-07 12:00 Jens Axboe
2023-10-03 12:00 Jens Axboe
2023-09-30 12:00 Jens Axboe
2023-09-29 12:00 Jens Axboe
2023-09-27 12:00 Jens Axboe
2023-09-20 12:00 Jens Axboe
2023-09-16 12:00 Jens Axboe
2023-09-12 12:00 Jens Axboe
2023-09-03 12:00 Jens Axboe
2023-08-24 12:00 Jens Axboe
2023-08-17 12:00 Jens Axboe
2023-08-15 12:00 Jens Axboe
2023-08-04 12:00 Jens Axboe
2023-08-03 12:00 Jens Axboe
2023-08-01 12:00 Jens Axboe
2023-07-29 12:00 Jens Axboe
2023-07-28 12:00 Jens Axboe
2023-07-22 12:00 Jens Axboe
2023-07-21 12:00 Jens Axboe
2023-07-16 12:00 Jens Axboe
2023-07-15 12:00 Jens Axboe
2023-07-14 12:00 Jens Axboe
2023-07-06 12:00 Jens Axboe
2023-07-04 12:00 Jens Axboe
2023-06-22 12:00 Jens Axboe
2023-06-17 12:00 Jens Axboe
2023-06-10 12:00 Jens Axboe
2023-06-09 12:00 Jens Axboe
2023-06-02 12:00 Jens Axboe
2023-05-31 12:00 Jens Axboe
2023-05-25 12:00 Jens Axboe
2023-05-24 12:00 Jens Axboe
2023-05-20 12:00 Jens Axboe
2023-05-19 12:00 Jens Axboe
2023-05-18 12:00 Jens Axboe
2023-05-17 12:00 Jens Axboe
2023-05-16 12:00 Jens Axboe
2023-05-12 12:00 Jens Axboe
2023-05-11 12:00 Jens Axboe
2023-04-28 12:00 Jens Axboe
2023-04-27 12:00 Jens Axboe
2023-04-21 12:00 Jens Axboe
2023-04-14 12:00 Jens Axboe
2023-04-11 12:00 Jens Axboe
2023-04-08 12:00 Jens Axboe
2023-04-05 12:00 Jens Axboe
2023-04-01 12:00 Jens Axboe
2023-03-28 12:00 Jens Axboe
2023-03-22 12:00 Jens Axboe
2023-03-21 12:00 Jens Axboe
2023-03-16 12:00 Jens Axboe
2023-03-15 12:00 Jens Axboe
2023-03-08 13:00 Jens Axboe
2023-03-04 13:00 Jens Axboe
2023-03-03 13:00 Jens Axboe
2023-03-01 13:00 Jens Axboe
2023-02-28 13:00 Jens Axboe
2023-02-24 13:00 Jens Axboe
2023-02-22 13:00 Jens Axboe
2023-02-21 13:00 Jens Axboe
2023-02-18 13:00 Jens Axboe
2023-02-16 13:00 Jens Axboe
2023-02-15 13:00 Jens Axboe
2023-02-11 13:00 Jens Axboe
2023-02-10 13:00 Jens Axboe
2023-02-08 13:00 Jens Axboe
2023-02-07 13:00 Jens Axboe
2023-02-04 13:00 Jens Axboe
2023-02-01 13:00 Jens Axboe
2023-01-31 13:00 Jens Axboe
2023-01-26 13:00 Jens Axboe
2023-01-25 13:00 Jens Axboe
2023-01-24 13:00 Jens Axboe
2023-01-21 13:00 Jens Axboe
2023-01-19 13:00 Jens Axboe
2023-01-12 13:00 Jens Axboe
2022-12-23 13:00 Jens Axboe
2022-12-17 13:00 Jens Axboe
2022-12-16 13:00 Jens Axboe
2022-12-13 13:00 Jens Axboe
2022-12-03 13:00 Jens Axboe
2022-12-02 13:00 Jens Axboe
2022-12-01 13:00 Jens Axboe
2022-11-30 13:00 Jens Axboe
2022-11-29 13:00 Jens Axboe
2022-11-24 13:00 Jens Axboe
2022-11-19 13:00 Jens Axboe
2022-11-15 13:00 Jens Axboe
2022-11-08 13:00 Jens Axboe
2022-11-07 13:00 Jens Axboe
2022-11-05 12:00 Jens Axboe
2022-11-03 12:00 Jens Axboe
2022-11-02 12:00 Jens Axboe
2022-10-25 12:00 Jens Axboe
2022-10-22 12:00 Jens Axboe
2022-10-20 12:00 Jens Axboe
2022-10-19 12:00 Jens Axboe
2022-10-17 12:00 Jens Axboe
2022-10-16 12:00 Jens Axboe
2022-10-15 12:00 Jens Axboe
2022-10-08 12:00 Jens Axboe
2022-10-06 12:00 Jens Axboe
2022-10-05 12:00 Jens Axboe
2022-10-04 12:00 Jens Axboe
2022-09-29 12:00 Jens Axboe
2022-09-23 12:00 Jens Axboe
2022-09-20 12:00 Jens Axboe
2022-09-16 12:00 Jens Axboe
2022-09-14 12:00 Jens Axboe
2022-09-13 12:00 Jens Axboe
2022-09-07 12:00 Jens Axboe
2022-09-04 12:00 Jens Axboe
2022-09-03 12:00 Jens Axboe
2022-09-02 12:00 Jens Axboe
2022-09-01 12:00 Jens Axboe
2022-08-31 12:00 Jens Axboe
2022-08-30 12:00 Jens Axboe
2022-08-27 12:00 Jens Axboe
2022-08-26 12:00 Jens Axboe
2022-08-25 12:00 Jens Axboe
2022-08-24 12:00 Jens Axboe
2022-08-17 12:00 Jens Axboe
2022-08-16 12:00 Jens Axboe
2022-08-12 12:00 Jens Axboe
2022-08-11 12:00 Jens Axboe
2022-08-10 12:00 Jens Axboe
2022-08-08 12:00 Jens Axboe
2022-08-04 12:00 Jens Axboe
2022-08-03 12:00 Jens Axboe
2022-08-01 12:00 Jens Axboe
2022-07-29 12:00 Jens Axboe
2022-07-28 12:00 Jens Axboe
2022-07-23 12:00 Jens Axboe
2022-07-22 12:00 Jens Axboe
2022-07-20 12:00 Jens Axboe
2022-07-12 12:00 Jens Axboe
2022-07-08 12:00 Jens Axboe
2022-07-07 12:00 Jens Axboe
2022-07-06 12:00 Jens Axboe
2022-07-02 12:00 Jens Axboe
2022-06-24 12:00 Jens Axboe
2022-06-23 12:00 Jens Axboe
2022-06-20 12:00 Jens Axboe
2022-06-16 12:00 Jens Axboe
2022-06-14 12:00 Jens Axboe
2022-06-02 12:00 Jens Axboe
2022-06-01 12:00 Jens Axboe
2022-05-30 12:00 Jens Axboe
2022-05-26 12:00 Jens Axboe
2022-05-13 12:00 Jens Axboe
2022-05-02 12:00 Jens Axboe
2022-04-30 12:00 Jens Axboe
2022-04-18 12:00 Jens Axboe
2022-04-11 12:00 Jens Axboe
2022-04-09 12:00 Jens Axboe
2022-04-07 12:00 Jens Axboe
2022-04-06 12:00 Jens Axboe
2022-03-31 12:00 Jens Axboe
2022-03-30 12:00 Jens Axboe
2022-03-29 12:00 Jens Axboe
2022-03-25 12:00 Jens Axboe
2022-03-21 12:00 Jens Axboe
2022-03-16 12:00 Jens Axboe
2022-03-12 13:00 Jens Axboe
2022-03-11 13:00 Jens Axboe
2022-03-10 13:00 Jens Axboe
2022-03-09 13:00 Jens Axboe
2022-03-08 13:00 Jens Axboe
2022-02-27 13:00 Jens Axboe
2022-02-25 13:00 Jens Axboe
2022-02-22 13:00 Jens Axboe
2022-02-21 13:00 Jens Axboe
2022-02-19 13:00 Jens Axboe
2022-02-18 13:00 Jens Axboe
2022-02-16 13:00 Jens Axboe
2022-02-12 13:00 Jens Axboe
2022-02-09 13:00 Jens Axboe
2022-02-05 13:00 Jens Axboe
2022-02-04 13:00 Jens Axboe
2022-01-29 13:00 Jens Axboe
2022-01-27 13:00 Jens Axboe
2022-01-22 13:00 Jens Axboe
2022-01-21 13:00 Jens Axboe
2022-01-19 13:00 Jens Axboe
2022-01-18 13:00 Jens Axboe
2022-01-11 13:00 Jens Axboe
2022-01-10 13:00 Jens Axboe
2021-12-24 13:00 Jens Axboe
2021-12-19 13:00 Jens Axboe
2021-12-16 13:00 Jens Axboe
2021-12-15 13:00 Jens Axboe
2021-12-11 13:00 Jens Axboe
2021-12-10 13:00 Jens Axboe
2021-12-07 13:00 Jens Axboe
2021-12-03 13:00 Jens Axboe
2021-11-26 13:00 Jens Axboe
2021-11-25 13:00 Jens Axboe
2021-11-22 13:00 Jens Axboe
2021-11-21 13:00 Jens Axboe
2021-11-20 13:00 Jens Axboe
2021-11-18 13:00 Jens Axboe
2021-11-13 13:00 Jens Axboe
2021-11-11 13:00 Jens Axboe
2021-10-26 12:00 Jens Axboe
2021-10-23 12:00 Jens Axboe
2021-10-25 15:37 ` Rebecca Cran
2021-10-25 15:41 ` Jens Axboe
2021-10-25 15:42 ` Rebecca Cran
2021-10-25 15:43 ` Jens Axboe
2021-10-20 12:00 Jens Axboe
2021-10-19 12:00 Jens Axboe
2021-10-18 12:00 Jens Axboe
2021-10-16 12:00 Jens Axboe
2021-10-15 12:00 Jens Axboe
2021-10-14 12:00 Jens Axboe
2021-10-13 12:00 Jens Axboe
2021-10-12 12:00 Jens Axboe
2021-10-10 12:00 Jens Axboe
2021-10-08 12:00 Jens Axboe
2021-10-06 12:00 Jens Axboe
2021-10-05 12:00 Jens Axboe
2021-10-02 12:00 Jens Axboe
2021-10-01 12:00 Jens Axboe
2021-09-30 12:00 Jens Axboe
2021-09-29 12:00 Jens Axboe
2021-09-27 12:00 Jens Axboe
2021-09-26 12:00 Jens Axboe
2021-09-25 12:00 Jens Axboe
2021-09-24 12:00 Jens Axboe
2021-09-21 12:00 Jens Axboe
2021-09-17 12:00 Jens Axboe
2021-09-16 12:00 Jens Axboe
2021-09-14 12:00 Jens Axboe
2021-09-09 12:00 Jens Axboe
2021-09-06 12:00 Jens Axboe
2021-09-04 12:00 Jens Axboe
2021-09-04 12:00 ` Jens Axboe
2021-09-03 12:00 Jens Axboe
2021-08-29 12:00 Jens Axboe
2021-08-28 12:00 Jens Axboe
2021-08-27 12:00 Jens Axboe
2021-08-21 12:00 Jens Axboe
2021-08-19 12:00 Jens Axboe
2021-08-14 12:00 Jens Axboe
2021-08-12 12:00 Jens Axboe
2021-08-07 12:00 Jens Axboe
2021-08-05 12:00 Jens Axboe
2021-08-04 12:00 Jens Axboe
2021-08-03 12:00 Jens Axboe
2021-08-02 12:00 Jens Axboe
2021-07-29 12:00 Jens Axboe
2021-07-26 12:00 Jens Axboe
2021-07-16 12:00 Jens Axboe
2021-07-08 12:00 Jens Axboe
2021-07-02 12:00 Jens Axboe
2021-06-30 12:00 Jens Axboe
2021-06-21 12:00 Jens Axboe
2021-06-18 12:00 Jens Axboe
2021-06-15 12:00 Jens Axboe
2021-06-11 12:00 Jens Axboe
2021-06-09 12:00 Jens Axboe
2021-06-04 12:00 Jens Axboe
2021-05-28 12:00 Jens Axboe
2021-05-27 12:00 Jens Axboe
2021-05-26 12:00 Jens Axboe
2021-05-19 12:00 Jens Axboe
2021-05-15 12:00 Jens Axboe
2021-05-12 12:00 Jens Axboe
2021-05-11 12:00 Jens Axboe
2021-05-09 12:00 Jens Axboe
2021-05-07 12:00 Jens Axboe
2021-04-28 12:00 Jens Axboe
2021-04-26 12:00 Jens Axboe
2021-04-24 12:00 Jens Axboe
2021-04-23 12:00 Jens Axboe
2021-04-17 12:00 Jens Axboe
2021-04-16 12:00 Jens Axboe
2021-04-14 12:00 Jens Axboe
2021-04-13 12:00 Jens Axboe
2021-04-11 12:00 Jens Axboe
2021-03-31 12:00 Jens Axboe
2021-03-19 12:00 Jens Axboe
2021-03-18 12:00 Jens Axboe
2021-03-12 13:00 Jens Axboe
2021-03-11 13:00 Jens Axboe
2021-03-10 13:00 Jens Axboe
2021-03-09 13:00 Jens Axboe
2021-03-07 13:00 Jens Axboe
2021-02-22 13:00 Jens Axboe
2021-02-17 13:00 Jens Axboe
2021-02-15 13:00 Jens Axboe
2021-02-11 13:00 Jens Axboe
2021-01-30 13:00 Jens Axboe
2021-01-28 13:00 Jens Axboe
2021-01-27 13:00 Jens Axboe
2021-01-26 13:00 Jens Axboe
2021-01-24 13:00 Jens Axboe
2021-01-17 13:00 Jens Axboe
2021-01-16 13:00 Jens Axboe
2021-01-13 13:00 Jens Axboe
2021-01-10 13:00 Jens Axboe
2021-01-08 13:00 Jens Axboe
2021-01-07 13:00 Jens Axboe
2021-01-06 13:00 Jens Axboe
2020-12-30 13:00 Jens Axboe
2020-12-25 13:00 Jens Axboe
2020-12-18 13:00 Jens Axboe
2020-12-16 13:00 Jens Axboe
2020-12-08 13:00 Jens Axboe
2020-12-06 13:00 Jens Axboe
2020-12-05 13:00 Jens Axboe
2020-12-04 13:00 Jens Axboe
2020-11-28 13:00 Jens Axboe
2020-11-26 13:00 Jens Axboe
2020-11-23 13:00 Jens Axboe
2020-11-14 13:00 Jens Axboe
2020-11-13 13:00 Jens Axboe
2020-11-10 13:00 Jens Axboe
2020-11-06 13:00 Jens Axboe
2020-11-12 20:51 ` Rebecca Cran
2020-11-05 13:00 Jens Axboe
2020-11-02 13:00 Jens Axboe
2020-10-31 12:00 Jens Axboe
2020-10-29 12:00 Jens Axboe
2020-10-15 12:00 Jens Axboe
2020-10-14 12:00 Jens Axboe
2020-10-11 12:00 Jens Axboe
2020-10-10 12:00 Jens Axboe
2020-09-15 12:00 Jens Axboe
2020-09-12 12:00 Jens Axboe
2020-09-10 12:00 Jens Axboe
2020-09-09 12:00 Jens Axboe
2020-09-08 12:00 Jens Axboe
2020-09-07 12:00 Jens Axboe
2020-09-06 12:00 Jens Axboe
2020-09-04 12:00 Jens Axboe
2020-09-02 12:00 Jens Axboe
2020-09-01 12:00 Jens Axboe
2020-08-30 12:00 Jens Axboe
2020-08-29 12:00 Jens Axboe
2020-08-28 12:00 Jens Axboe
2020-08-23 12:00 Jens Axboe
2020-08-22 12:00 Jens Axboe
2020-08-20 12:00 Jens Axboe
2020-08-19 12:00 Jens Axboe
2020-08-18 12:00 Jens Axboe
2020-08-17 12:00 Jens Axboe
2020-08-15 12:00 Jens Axboe
2020-08-14 12:00 Jens Axboe
2020-08-13 12:00 Jens Axboe
2020-08-12 12:00 Jens Axboe
2020-08-11 12:00 Jens Axboe
2020-08-08 12:00 Jens Axboe
2020-08-02 12:00 Jens Axboe
2020-07-28 12:00 Jens Axboe
2020-07-27 12:00 Jens Axboe
2020-07-26 12:00 Jens Axboe
2020-07-25 12:00 Jens Axboe
2020-07-22 12:00 Jens Axboe
2020-07-21 12:00 Jens Axboe
2020-07-19 12:00 Jens Axboe
2020-07-18 12:00 Jens Axboe
2020-07-15 12:00 Jens Axboe
2020-07-14 12:00 Jens Axboe
2020-07-09 12:00 Jens Axboe
2020-07-05 12:00 Jens Axboe
2020-07-04 12:00 Jens Axboe
2020-07-03 12:00 Jens Axboe
2020-06-29 12:00 Jens Axboe
2020-06-25 12:00 Jens Axboe
2020-06-24 12:00 Jens Axboe
2020-06-22 12:00 Jens Axboe
2020-06-13 12:00 Jens Axboe
2020-06-10 12:00 Jens Axboe
2020-06-08 12:00 Jens Axboe
2020-06-06 12:00 Jens Axboe
2020-06-04 12:00 Jens Axboe
2020-06-03 12:00 Jens Axboe
2020-05-30 12:00 Jens Axboe
2020-05-29 12:00 Jens Axboe
2020-05-26 12:00 Jens Axboe
2020-05-25 12:00 Jens Axboe
2020-05-24 12:00 Jens Axboe
2020-05-22 12:00 Jens Axboe
2020-05-21 12:00 Jens Axboe
2020-05-20 12:00 Jens Axboe
2020-05-19 12:00 Jens Axboe
2020-05-15 12:00 Jens Axboe
2020-05-14 12:00 Jens Axboe
2020-05-12 12:00 Jens Axboe
2020-04-30 12:00 Jens Axboe
2020-04-22 12:00 Jens Axboe
2020-04-21 12:00 Jens Axboe
2020-04-18 12:00 Jens Axboe
2020-04-17 12:00 Jens Axboe
2020-04-16 12:00 Jens Axboe
2020-04-14 12:00 Jens Axboe
2020-04-09 12:00 Jens Axboe
2020-04-08 12:00 Jens Axboe
2020-04-07 12:00 Jens Axboe
2020-04-03 12:00 Jens Axboe
2020-04-01 12:00 Jens Axboe
2020-03-27 12:00 Jens Axboe
2020-03-18 12:00 Jens Axboe
2020-03-17 12:00 Jens Axboe
2020-03-16 12:00 Jens Axboe
2020-03-13 12:00 Jens Axboe
2020-03-04 13:00 Jens Axboe
2020-03-03 13:00 Jens Axboe
2020-03-02 13:00 Jens Axboe
2020-02-27 13:00 Jens Axboe
2020-02-25 13:00 Jens Axboe
2020-02-07 13:00 Jens Axboe
2020-02-06 13:00 Jens Axboe
2020-02-05 13:00 Jens Axboe
2020-01-29 13:00 Jens Axboe
2020-01-24 13:00 Jens Axboe
2020-01-23 13:00 Jens Axboe
2020-01-19 13:00 Jens Axboe
2020-01-17 13:00 Jens Axboe
2020-01-15 13:00 Jens Axboe
2020-01-14 13:00 Jens Axboe
2020-01-10 13:00 Jens Axboe
2020-01-07 13:00 Jens Axboe
2020-01-06 13:00 Jens Axboe
2020-01-05 13:00 Jens Axboe
2020-01-04 13:00 Jens Axboe
2019-12-26 13:00 Jens Axboe
2019-12-24 13:00 Jens Axboe
2019-12-22 13:00 Jens Axboe
2019-12-19 13:00 Jens Axboe
2019-12-17 13:00 Jens Axboe
2019-12-12 13:00 Jens Axboe
2019-12-07 13:00 Jens Axboe
2019-11-28 13:00 Jens Axboe
2019-11-27 13:00 Jens Axboe
2019-11-26 13:00 Jens Axboe
2019-11-15 13:00 Jens Axboe
2019-11-07 15:25 Jens Axboe
2019-11-07 13:00 Jens Axboe
2019-11-06 13:00 Jens Axboe
2019-11-04 13:00 Jens Axboe
2019-11-03 13:00 Jens Axboe
2019-10-30 12:00 Jens Axboe
2019-10-25 12:00 Jens Axboe
2019-10-22 12:00 Jens Axboe
2019-10-16 12:00 Jens Axboe
2019-10-15 12:00 Jens Axboe
2019-10-14 12:00 Jens Axboe
2019-10-09 12:00 Jens Axboe
2019-10-08 12:00 Jens Axboe
2019-10-07 12:00 Jens Axboe
2019-10-03 12:00 Jens Axboe
2019-10-02 12:00 Jens Axboe
2019-09-28 12:00 Jens Axboe
2019-09-26 12:00 Jens Axboe
2019-09-25 12:00 Jens Axboe
2019-09-24 12:00 Jens Axboe
2019-09-20 12:00 Jens Axboe
2019-09-14 12:00 Jens Axboe
2019-09-13 12:00 Jens Axboe
2019-09-06 12:00 Jens Axboe
2019-09-04 12:00 Jens Axboe
2019-08-30 12:00 Jens Axboe
2019-08-29 12:00 Jens Axboe
2019-08-16 12:00 Jens Axboe
2019-08-15 12:00 Jens Axboe
2019-08-15 14:27 ` Rebecca Cran
2019-08-15 14:28 ` Jens Axboe
2019-08-15 15:05 ` Rebecca Cran
2019-08-15 15:17 ` Jens Axboe
2019-08-15 15:35 ` Rebecca Cran
2019-08-09 12:00 Jens Axboe
2019-08-06 12:00 Jens Axboe
2019-08-04 12:00 Jens Axboe
2019-08-03 12:00 Jens Axboe
2019-08-01 12:00 Jens Axboe
2019-07-27 12:00 Jens Axboe
2019-07-13 12:00 Jens Axboe
2019-07-10 12:00 Jens Axboe
2019-07-02 12:00 Jens Axboe
2019-06-01 12:00 Jens Axboe
2019-05-24 12:00 Jens Axboe
2019-05-23 12:00 Jens Axboe
2019-05-21 12:00 Jens Axboe
2019-05-17 12:00 Jens Axboe
2019-05-10 12:00 Jens Axboe
2019-05-09 12:00 Jens Axboe
2019-05-09 12:47 ` Erwan Velu
2019-05-09 14:07 ` Jens Axboe
2019-05-09 15:47 ` Elliott, Robert (Servers)
2019-05-09 15:52 ` Sebastien Boisvert
2019-05-09 16:12 ` Elliott, Robert (Servers)
2019-05-09 15:57 ` Jens Axboe
2019-05-07 12:00 Jens Axboe
2019-04-26 12:00 Jens Axboe
2019-04-23 12:00 Jens Axboe
2019-04-20 12:00 Jens Axboe
2019-04-19 12:00 Jens Axboe
2019-04-18 12:00 Jens Axboe
2019-04-02 12:00 Jens Axboe
2019-03-26 12:00 Jens Axboe
2019-03-22 12:00 Jens Axboe
2019-03-12 12:00 Jens Axboe
2019-03-09 13:00 Jens Axboe
2019-03-08 13:00 Jens Axboe
2019-03-07 13:00 Jens Axboe
2019-03-01 13:00 Jens Axboe
2019-02-25 13:00 Jens Axboe
2019-02-24 13:00 Jens Axboe
2019-02-22 13:00 Jens Axboe
2019-02-12 13:00 Jens Axboe
2019-02-11 13:00 Jens Axboe
2019-02-09 13:00 Jens Axboe
2019-02-08 13:00 Jens Axboe
2019-02-05 13:00 Jens Axboe
2019-02-01 13:00 Jens Axboe
2019-01-30 13:00 Jens Axboe
2019-01-29 13:00 Jens Axboe
2019-01-25 13:00 Jens Axboe
2019-01-24 13:00 Jens Axboe
2019-01-17 13:00 Jens Axboe
2019-01-16 13:00 Jens Axboe
2019-01-15 13:00 Jens Axboe
2019-01-14 13:00 Jens Axboe
2019-01-13 13:00 Jens Axboe
2019-01-12 13:00 Jens Axboe
2019-01-11 13:00 Jens Axboe
2019-01-10 13:00 Jens Axboe
2019-01-09 13:00 Jens Axboe
2019-01-08 13:00 Jens Axboe
2019-01-06 13:00 Jens Axboe
2019-01-05 13:00 Jens Axboe
2018-12-31 13:00 Jens Axboe
2018-12-22 13:00 Jens Axboe
2018-12-20 13:00 Jens Axboe
2018-12-15 13:00 Jens Axboe
2018-12-14 13:00 Jens Axboe
2018-12-13 13:00 Jens Axboe
2018-12-11 13:00 Jens Axboe
2018-12-05 13:00 Jens Axboe
2018-12-02 13:00 Jens Axboe
2018-12-01 13:00 Jens Axboe
2018-11-30 13:00 Jens Axboe
2018-11-28 13:00 Jens Axboe
2018-11-27 13:00 Jens Axboe
2018-11-26 13:00 Jens Axboe
2018-11-25 13:00 Jens Axboe
2018-11-22 13:00 Jens Axboe
2018-11-21 13:00 Jens Axboe
2018-11-20 13:00 Jens Axboe
2018-11-16 13:00 Jens Axboe
2018-11-07 13:00 Jens Axboe
2018-11-03 12:00 Jens Axboe
2018-10-27 12:00 Jens Axboe
2018-10-24 12:00 Jens Axboe
2018-10-20 12:00 Jens Axboe
2018-10-19 12:00 Jens Axboe
2018-10-16 12:00 Jens Axboe
2018-10-09 12:00 Jens Axboe
2018-10-06 12:00 Jens Axboe
2018-10-05 12:00 Jens Axboe
2018-10-04 12:00 Jens Axboe
2018-10-02 12:00 Jens Axboe
2018-10-01 12:00 Jens Axboe
2018-09-30 12:00 Jens Axboe
2018-09-28 12:00 Jens Axboe
2018-09-27 12:00 Jens Axboe
2018-09-26 12:00 Jens Axboe
2018-09-23 12:00 Jens Axboe
2018-09-22 12:00 Jens Axboe
2018-09-21 12:00 Jens Axboe
2018-09-20 12:00 Jens Axboe
2018-09-18 12:00 Jens Axboe
2018-09-17 12:00 Jens Axboe
2018-09-13 12:00 Jens Axboe
2018-09-12 12:00 Jens Axboe
2018-09-11 12:00 Jens Axboe
2018-09-10 12:00 Jens Axboe
2018-09-09 12:00 Jens Axboe
2018-09-08 12:00 Jens Axboe
2018-09-07 12:00 Jens Axboe
2018-09-06 12:00 Jens Axboe
2018-09-04 12:00 Jens Axboe
2018-09-01 12:00 Jens Axboe
2018-08-31 12:00 Jens Axboe
2018-08-26 12:00 Jens Axboe
2018-08-25 12:00 Jens Axboe
2018-08-24 12:00 Jens Axboe
2018-08-23 12:00 Jens Axboe
2018-08-22 12:00 Jens Axboe
2018-08-21 12:00 Jens Axboe
2018-08-18 12:00 Jens Axboe
2018-08-17 12:00 Jens Axboe
2018-08-16 12:00 Jens Axboe
2018-08-15 12:00 Jens Axboe
2018-08-14 12:00 Jens Axboe
2018-08-13 12:00 Jens Axboe
2018-08-11 12:00 Jens Axboe
2018-08-10 12:00 Jens Axboe
2018-08-08 12:00 Jens Axboe
2018-08-06 12:00 Jens Axboe
2018-08-04 12:00 Jens Axboe
2018-08-03 12:00 Jens Axboe
2018-07-31 12:00 Jens Axboe
2018-07-27 12:00 Jens Axboe
2018-07-26 12:00 Jens Axboe
2018-07-25 12:00 Jens Axboe
2018-07-24 12:00 Jens Axboe
2018-07-13 12:00 Jens Axboe
2018-07-12 12:00 Jens Axboe
2018-07-11 12:00 Jens Axboe
2018-07-05 12:00 Jens Axboe
2018-06-30 12:00 Jens Axboe
2018-06-22 12:00 Jens Axboe
2018-06-19 12:00 Jens Axboe
2018-06-16 12:00 Jens Axboe
2018-06-13 12:00 Jens Axboe
2018-06-12 12:00 Jens Axboe
2018-06-09 12:00 Jens Axboe
2018-06-08 12:00 Jens Axboe
2018-06-06 12:00 Jens Axboe
2018-06-05 12:00 Jens Axboe
2018-06-02 12:00 Jens Axboe
2018-06-01 12:00 Jens Axboe
2018-05-26 12:00 Jens Axboe
2018-05-19 12:00 Jens Axboe
2018-05-17 12:00 Jens Axboe
2018-05-15 12:00 Jens Axboe
2018-04-27 12:00 Jens Axboe
2018-04-25 12:00 Jens Axboe
2018-04-21 12:00 Jens Axboe
2018-04-19 12:00 Jens Axboe
2018-04-18 12:00 Jens Axboe
2018-04-17 12:00 Jens Axboe
2018-04-15 12:00 Jens Axboe
2018-04-14 12:00 Jens Axboe
2018-04-11 12:00 Jens Axboe
2018-04-10 12:00 Jens Axboe
2018-04-09 12:00 Jens Axboe
2018-04-07 12:00 Jens Axboe
2018-04-05 12:00 Jens Axboe
2018-04-04 12:00 Jens Axboe
2018-03-31 12:00 Jens Axboe
2018-03-30 12:00 Jens Axboe
2018-03-24 12:00 Jens Axboe
2018-03-23 12:00 Jens Axboe
2018-03-22 12:00 Jens Axboe
2018-03-21 12:00 Jens Axboe
2018-03-20 12:00 Jens Axboe
2018-03-14 12:00 Jens Axboe
2018-03-13 12:00 Jens Axboe
2018-03-10 13:00 Jens Axboe
2018-03-08 13:00 Jens Axboe
2018-03-07 13:00 Jens Axboe
2018-03-06 13:00 Jens Axboe
2018-03-03 13:00 Jens Axboe
2018-03-02 13:00 Jens Axboe
2018-03-01 13:00 Jens Axboe
2018-02-28 13:00 Jens Axboe
2018-02-27 13:00 Jens Axboe
2018-02-21 13:00 Jens Axboe
2018-02-15 13:00 Jens Axboe
2018-02-13 13:00 Jens Axboe
2018-02-11 13:00 Jens Axboe
2018-02-09 13:00 Jens Axboe
2018-02-08 13:00 Jens Axboe
2018-01-26 13:00 Jens Axboe
2018-01-25 13:00 Jens Axboe
2018-01-17 13:00 Jens Axboe
2018-01-13 13:00 Jens Axboe
2018-01-11 13:00 Jens Axboe
2018-01-07 13:00 Jens Axboe
2018-01-06 13:00 Jens Axboe
2018-01-03 13:00 Jens Axboe
2017-12-30 13:00 Jens Axboe
2017-12-29 13:00 Jens Axboe
2017-12-28 13:00 Jens Axboe
2017-12-22 13:00 Jens Axboe
2017-12-20 13:00 Jens Axboe
2017-12-16 13:00 Jens Axboe
2017-12-15 13:00 Jens Axboe
2017-12-14 13:00 Jens Axboe
2017-12-09 13:00 Jens Axboe
2017-12-08 13:00 Jens Axboe
2017-12-07 13:00 Jens Axboe
2017-12-04 13:00 Jens Axboe
2017-12-03 13:00 Jens Axboe
2017-12-02 13:00 Jens Axboe
2017-12-01 13:00 Jens Axboe
2017-11-30 13:00 Jens Axboe
2017-11-29 13:00 Jens Axboe
2017-11-24 13:00 Jens Axboe
2017-11-23 13:00 Jens Axboe
2017-11-18 13:00 Jens Axboe
2017-11-20 15:00 ` Elliott, Robert (Persistent Memory)
2017-11-17 13:00 Jens Axboe
2017-11-16 13:00 Jens Axboe
2017-11-07 13:00 Jens Axboe
2017-11-04 12:00 Jens Axboe
2017-11-03 12:00 Jens Axboe
2017-11-02 12:00 Jens Axboe
2017-11-01 12:00 Jens Axboe
2017-10-31 12:00 Jens Axboe
2017-10-27 12:00 Jens Axboe
2017-10-26 12:00 Jens Axboe
2017-10-21 12:00 Jens Axboe
2017-10-18 12:00 Jens Axboe
2017-10-13 12:00 Jens Axboe
2017-10-12 12:00 Jens Axboe
2017-10-11 12:00 Jens Axboe
2017-10-10 12:00 Jens Axboe
2017-10-07 12:00 Jens Axboe
2017-10-04 12:00 Jens Axboe
2017-09-29 12:00 Jens Axboe
2017-09-28 12:00 Jens Axboe
2017-09-27 12:00 Jens Axboe
2017-09-21 12:00 Jens Axboe
2017-09-19 12:00 Jens Axboe
2017-09-15 12:00 Jens Axboe
2017-09-14 12:00 Jens Axboe
2017-09-13 12:00 Jens Axboe
2017-09-12 12:00 Jens Axboe
2017-09-06 12:00 Jens Axboe
2017-09-03 12:00 Jens Axboe
2017-09-02 12:00 Jens Axboe
2017-09-01 12:00 Jens Axboe
2017-08-31 12:00 Jens Axboe
2017-08-30 12:00 Jens Axboe
2017-08-29 12:00 Jens Axboe
2017-08-28 12:00 Jens Axboe
2017-08-24 12:00 Jens Axboe
2017-08-23 12:00 Jens Axboe
2017-08-18 12:00 Jens Axboe
2017-08-17 12:00 Jens Axboe
2017-08-15 12:00 Jens Axboe
2017-08-10 12:00 Jens Axboe
2017-08-09 12:00 Jens Axboe
2017-08-08 12:00 Jens Axboe
2017-08-02 12:00 Jens Axboe
2017-08-01 12:00 Jens Axboe
2017-07-28 12:00 Jens Axboe
2017-07-26 12:00 Jens Axboe
2017-07-21 12:00 Jens Axboe
2017-07-17 12:00 Jens Axboe
2017-07-15 12:00 Jens Axboe
2017-07-14 12:00 Jens Axboe
2017-07-13 12:00 Jens Axboe
2013-03-20 5:00 Jens Axboe
2017-11-05 13:00 ` Jens Axboe
2017-11-06 13:00 ` Jens Axboe
2017-11-08 13:00 ` Jens Axboe
2018-01-24 13:00 ` Jens Axboe
2018-01-25 13:00 ` Jens Axboe
2018-04-10 12:00 ` Jens Axboe
2018-05-03 12:00 ` Jens Axboe
2018-05-17 12:00 ` Jens Axboe
2018-08-31 12:00 ` Jens Axboe
2018-09-01 12:00 ` Jens Axboe
2019-05-22 12:00 ` Jens Axboe
2019-09-17 12:00 ` Jens Axboe
2019-09-25 12:00 ` Jens Axboe
2020-01-17 13:00 ` Jens Axboe
2020-03-21 12:00 ` Jens Axboe
2020-05-08 12:00 ` Jens Axboe
2020-05-21 12:00 ` Jens Axboe
2021-02-20 13:00 ` Jens Axboe
2021-04-20 12:00 ` Jens Axboe
2021-06-15 11:59 ` Jens Axboe
2021-06-29 12:00 ` Jens Axboe
2021-10-22 12:00 ` 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=20260625120001.5E2C71BC0156@kernel.dk \
--to=axboe@kernel.dk \
--cc=fio@vger.kernel.org \
/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.