From: Jens Axboe <axboe@kernel.dk>
To: <fio@vger.kernel.org>
Subject: Recent changes (master)
Date: Thu, 11 Jun 2026 06:00:01 -0600 [thread overview]
Message-ID: <20260611120001.848241BC0156@kernel.dk> (raw)
The following changes since commit f055bacb90990b96fe9940579b3f7eda3515679f:
t/nvmept_write_mode: fix fio path (2026-06-10 00:21:19 +0000)
are available in the Git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to bd11387aba55e9dc58c0127437c8c6982e6ac32f:
ci: skip new write uncorrectable tests on QEMU (2026-06-10 22:28:50 +0000)
----------------------------------------------------------------
Minwoo Im (3):
io_uring_cmd: support mixed write_mode with ratio
io_u: add zeroed, errored flags to @io_u for verify
t/nvmept_write_mode: add multiple write_mode tests
Vincent Fu (7):
Merge branch 'io_uring/multiple-write-modes' of https://github.com/minwooim/fio
engines/io_uring_cmd: debug print for write mode
verify: debug print for verifying write zeroes
t/nvmept_write_mode: check write mode splits
t/nvmept_write_mode: check verify job
t/nvmept_write_mode: improve formatting
ci: skip new write uncorrectable tests on QEMU
.github/workflows/qemu.yml | 2 +-
HOWTO.rst | 6 +
engines/io_uring.c | 261 +++++++++++++++++++++++++++-----
examples/uring-cmd-write-mode.fio | 21 +++
examples/uring-cmd-write-mode.png | Bin 0 -> 41207 bytes
fio.1 | 6 +
fio.h | 1 +
io_u.c | 11 +-
io_u.h | 2 +
iolog.c | 5 +
iolog.h | 2 +
t/nvmept_write_mode.py | 303 ++++++++++++++++++++++++++++++++++++--
verify.c | 25 +++-
13 files changed, 590 insertions(+), 55 deletions(-)
create mode 100644 examples/uring-cmd-write-mode.fio
create mode 100644 examples/uring-cmd-write-mode.png
---
Diff of recent changes:
diff --git a/.github/workflows/qemu.yml b/.github/workflows/qemu.yml
index ba0a00ac..451ecd42 100644
--- a/.github/workflows/qemu.yml
+++ b/.github/workflows/qemu.yml
@@ -18,7 +18,7 @@ jobs:
-device nvme,id=nvme0,serial=deadbeef
-drive id=nvm-0,file=nvme0.img,format=raw,if=none,discard=unmap,media=disk
-device nvme-ns,id=nvm-0,drive=nvm-0,bus=nvme0,nsid=1
- test_cmd: "python3 t/run-fio-tests.py --nvmecdev /dev/ng0n1 --run-only 1014 1015 1022 -p '1022:--skip 30 31 32 33 34'"
+ test_cmd: "python3 t/run-fio-tests.py --nvmecdev /dev/ng0n1 --run-only 1014 1015 1022 -p '1022:--skip 30 31 32 33 34 40 50 51 53 70'"
extra_pkgs: "nvme-cli"
- config: 16-bit Guard PI tests (long)
device: >-
diff --git a/HOWTO.rst b/HOWTO.rst
index 63964eb9..ac570972 100644
--- a/HOWTO.rst
+++ b/HOWTO.rst
@@ -3049,6 +3049,12 @@ with the caveat that when used on the command line, they must come after the
**verify**
Use Verify commands for write operations
+ Multiple modes with mix ratios can be specified using the format
+ ``mode/pct:mode/pct:...``. Percentages must sum to 100. If a
+ percentage is omitted, the remaining percentage is split evenly among
+ entries with no percentage specified.
+ Example: ``write/60:zeroes/30:uncor/10`` or ``write/50:zeroes/:uncor/``
+
.. option:: verify_mode=str : [io_uring_cmd]
Specifies the type of command to be used in the verification phase. Defaults to 'read'.
diff --git a/engines/io_uring.c b/engines/io_uring.c
index 6aedb062..b7b912b3 100644
--- a/engines/io_uring.c
+++ b/engines/io_uring.c
@@ -104,6 +104,14 @@ enum uring_cmd_write_mode {
FIO_URING_CMD_WMODE_VERIFY,
};
+#define WMODE_SPLIT_MAX 4
+
+struct wmode_split_entry {
+ uint8_t opcode;
+ uint32_t cdw12_flag;
+ unsigned int perc;
+};
+
enum uring_cmd_verify_mode {
FIO_URING_CMD_VMODE_READ = 1,
FIO_URING_CMD_VMODE_COMPARE,
@@ -161,6 +169,7 @@ struct ioring_data {
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;
@@ -174,6 +183,8 @@ struct ioring_options {
unsigned int writefua;
unsigned int deac;
unsigned int write_mode;
+ struct wmode_split_entry wmode_split[WMODE_SPLIT_MAX];
+ unsigned int wmode_split_nr;
unsigned int verify_mode;
struct cmdprio_options cmdprio_options;
unsigned int fixedbufs;
@@ -206,6 +217,138 @@ static const int fixed_ddir_to_op[2] = {
IORING_OP_WRITE_FIXED
};
+static uint8_t wmode_str_to_opcode(const char *mode)
+{
+ if (!strcmp(mode, "write"))
+ return nvme_cmd_write;
+ if (!strcmp(mode, "uncor"))
+ return nvme_cmd_write_uncor;
+ if (!strcmp(mode, "zeroes"))
+ return nvme_cmd_write_zeroes;
+ if (!strcmp(mode, "verify"))
+ return nvme_cmd_verify;
+ return 0xff;
+}
+
+static int str_write_mode_cb(void *data, const char *str)
+{
+ struct ioring_options *o = data;
+ char *s, *p, *tok;
+ unsigned int total_perc = 0, perc_missing;
+ int i = 0, j;
+
+ /* Single-value: no ':' means single mode name */
+ if (!strchr(str, ':')) {
+ uint8_t op = wmode_str_to_opcode(str);
+
+ if (op == 0xff) {
+ log_err("fio: invalid write_mode value: %s\n", str);
+ return 1;
+ }
+
+ if (op == nvme_cmd_write_uncor)
+ o->write_mode = FIO_URING_CMD_WMODE_UNCOR;
+ else if (op == nvme_cmd_write_zeroes)
+ o->write_mode = FIO_URING_CMD_WMODE_ZEROES;
+ else if (op == nvme_cmd_verify)
+ o->write_mode = FIO_URING_CMD_WMODE_VERIFY;
+ else
+ o->write_mode = FIO_URING_CMD_WMODE_WRITE;
+ o->wmode_split_nr = 0;
+ return 0;
+ }
+
+ /* Multi-value: e.g., --write_mode=write/60:zeroes/30:uncor/10 */
+ s = strdup(str);
+ p = s;
+ while ((tok = strsep(&p, ":")) != NULL) {
+ char *perc_str = strchr(tok, '/');
+ unsigned int perc;
+ uint8_t op;
+
+ if (i >= WMODE_SPLIT_MAX) {
+ log_err("fio: write_mode: too many entries (max %d)\n",
+ WMODE_SPLIT_MAX);
+ free(s);
+ return 1;
+ }
+
+ if (!perc_str) {
+ log_err("fio: write_mode: missing '/' in entry: %s\n", tok);
+ free(s);
+ return 1;
+ }
+
+ *perc_str++ = '\0';
+ op = wmode_str_to_opcode(tok);
+ if (op == 0xff) {
+ log_err("fio: invalid write_mode value: %s\n", tok);
+ free(s);
+ return 1;
+ }
+
+ if (*perc_str) {
+ int tmp = atoi(perc_str);
+
+ if (tmp < 0) {
+ log_err("fio: write_mode: percentage must not be negative: %s\n",
+ perc_str);
+ free(s);
+ return 1;
+ }
+
+ perc = (unsigned int)tmp;
+ total_perc += perc;
+ } else {
+ /* blank percentage: fill in evenly later */
+ perc = -1U;
+ }
+
+ o->wmode_split[i].opcode = op;
+ o->wmode_split[i].cdw12_flag = 0;
+ o->wmode_split[i].perc = perc;
+ i++;
+ }
+ free(s);
+
+ if (i < 2) {
+ log_err("fio: write_mode needs at least 2 entries\n");
+ return 1;
+ }
+
+ if (total_perc > 100) {
+ log_err("fio: write_mode percentages exceed 100%%\n");
+ return 1;
+ }
+
+ /*
+ * Distribute the remaining percentage evenly among blank entries,
+ * matching bssplit behavior (e.g. write/50:zeroes/:uncor/ gives 25%
+ * each to zeroes and uncor).
+ */
+ perc_missing = 0;
+ for (j = 0; j < i; j++) {
+ if (o->wmode_split[j].perc == -1U)
+ perc_missing++;
+ }
+
+ if (perc_missing) {
+ unsigned int fill = (100 - total_perc) / perc_missing;
+
+ for (j = 0; j < i; j++) {
+ if (o->wmode_split[j].perc == -1U)
+ o->wmode_split[j].perc = fill;
+ }
+ } else if (total_perc != 100) {
+ log_err("fio: write_mode percentages should add up to 100%%\n");
+ return 1;
+ }
+
+ o->wmode_split_nr = i;
+ o->write_mode = FIO_URING_CMD_WMODE_WRITE;
+ return 0;
+}
+
static int fio_ioring_sqpoll_cb(void *data, unsigned long long *val)
{
struct ioring_options *o = data;
@@ -247,29 +390,13 @@ static struct fio_option options[] = {
},
{
.name = "write_mode",
- .lname = "Additional Write commands support (Write Uncorrectable, Write Zeores)",
+ .lname = "Write command type(s) with optional mix ratios",
.type = FIO_OPT_STR,
- .off1 = offsetof(struct ioring_options, write_mode),
- .help = "Issue Write Uncorrectable or Zeroes command instead of Write command",
+ .cb = str_write_mode_cb,
+ .help = "Single: write|uncor|zeroes|verify. "
+ "Mixed: mode/pct:mode/pct:... (e.g. write/60:zeroes/40). "
+ "Blank pct evenly splits the remainder (e.g. write/50:zeroes/:uncor/)",
.def = "write",
- .posval = {
- { .ival = "write",
- .oval = FIO_URING_CMD_WMODE_WRITE,
- .help = "Issue Write commands for write operations"
- },
- { .ival = "uncor",
- .oval = FIO_URING_CMD_WMODE_UNCOR,
- .help = "Issue Write Uncorrectable commands for write operations"
- },
- { .ival = "zeroes",
- .oval = FIO_URING_CMD_WMODE_ZEROES,
- .help = "Issue Write Zeroes commands for write operations"
- },
- { .ival = "verify",
- .oval = FIO_URING_CMD_WMODE_VERIFY,
- .help = "Issue Verify commands for write operations"
- },
- },
.category = FIO_OPT_C_ENGINE,
.group = FIO_OPT_G_IOURING,
},
@@ -647,6 +774,35 @@ static int fio_ioring_cmd_prep(struct thread_data *td, struct io_u *io_u)
io_u_set(td, io_u, IO_U_F_VER_IN_DEV);
}
+ 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;
+
+ 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,
+ o->nonvectored ? NULL : &ld->iovecs[io_u->index],
+ dsm, read_opcode, op,
+ o->wmode_split[i].cdw12_flag);
+ }
+ }
+ }
+
return fio_nvme_uring_cmd_prep(cmd, io_u,
o->nonvectored ? NULL : &ld->iovecs[io_u->index],
dsm, read_opcode, ld->write_opcode,
@@ -1459,27 +1615,44 @@ static int fio_ioring_cmd_init(struct thread_data *td, struct ioring_data *ld)
struct ioring_options *o = td->eo;
if (td_write(td)) {
- 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->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;
+ }
}
}
if (o->readfua)
ld->cdw12_flags[DDIR_READ] = 1 << 30;
- if (o->writefua)
+ if (o->writefua && o->wmode_split_nr <= 1)
ld->cdw12_flags[DDIR_WRITE] = 1 << 30;
return 0;
@@ -1649,6 +1822,17 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u)
io_u->engine_data = pi_data;
}
+ if (ld->is_uring_cmd_eng && o->wmode_split_nr <= 1) {
+ if (ld->write_opcode == 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 (ld->write_opcode == nvme_cmd_write_uncor) {
+ io_u_set(td, io_u, IO_U_F_ERRORED);
+ }
+ }
+
return 0;
}
@@ -1840,7 +2024,8 @@ static int fio_ioring_open_nvme(struct thread_data *td, struct fio_file *f)
return 1;
}
- if (o->write_mode != FIO_URING_CMD_WMODE_WRITE && !td_write(td)) {
+ if ((o->write_mode != FIO_URING_CMD_WMODE_WRITE || o->wmode_split_nr > 1) &&
+ !td_write(td)) {
log_err("%s: 'readwrite=|rw=' has no write\n", f->file_name);
td_verror(td, EINVAL, "fio_ioring_cmd_open_file");
return 1;
diff --git a/examples/uring-cmd-write-mode.fio b/examples/uring-cmd-write-mode.fio
new file mode 100644
index 00000000..63e4c18c
--- /dev/null
+++ b/examples/uring-cmd-write-mode.fio
@@ -0,0 +1,21 @@
+# io_uring_cmd mixed write_mode example
+#
+# Issues write, zeroes, uncor, and verify commands in a single job
+# using the ratio-based write_mode syntax:
+#
+# write_mode=write/40:zeroes/30:uncor/20:verify/10
+#
+# Replace /dev/ng0n1 with the target nvme-ns generic character device.
+
+[global]
+filename=/dev/ng0n1
+ioengine=io_uring_cmd
+cmd_type=nvme
+size=1G
+iodepth=32
+bs=4K
+thread=1
+
+[mixed-write-modes]
+rw=write
+write_mode=write/40:zeroes/30:uncor/20:verify/10
diff --git a/examples/uring-cmd-write-mode.png b/examples/uring-cmd-write-mode.png
new file mode 100644
index 00000000..8754c111
Binary files /dev/null and b/examples/uring-cmd-write-mode.png differ
diff --git a/fio.1 b/fio.1
index 71a7309a..d2933a8f 100644
--- a/fio.1
+++ b/fio.1
@@ -2835,6 +2835,12 @@ Use Write Zeroes commands for write operations
.B verify
Use Verify commands for write operations
.RE
+.P
+Multiple modes with mix ratios can be specified using the format
+\fBmode/pct:mode/pct:...\fR. Percentages must sum to 100. If a percentage
+is omitted, the remaining percentage is split evenly among entries with no
+percentage specified.
+Example: \fBwrite/60:zeroes/30:uncor/10\fR or \fBwrite/50:zeroes/:uncor/\fR
.RE
.TP
.BI (io_uring_cmd)verify_mode \fR=\fPstr
diff --git a/fio.h b/fio.h
index 8ef3523e..b05abf77 100644
--- a/fio.h
+++ b/fio.h
@@ -156,6 +156,7 @@ enum {
FIO_RAND_DEDUPE_WORKING_SET_IX,
FIO_RAND_FDP_OFF,
FIO_RAND_SPRANDOM_OFF,
+ FIO_RAND_WMODE_OFF,
FIO_RAND_NR_OFFS,
};
diff --git a/io_u.c b/io_u.c
index 8b90dd1b..c3327f16 100644
--- a/io_u.c
+++ b/io_u.c
@@ -2232,9 +2232,16 @@ static void io_completed(struct thread_data *td, struct io_u **io_u_ptr,
icd->error = ret;
}
} else if (io_u->error) {
+ if (!((io_u->flags & IO_U_F_ERRORED) &&
+ (io_u->flags & IO_U_F_VER_LIST))) {
error:
- icd->error = io_u->error;
- io_u_log_error(td, io_u);
+ icd->error = io_u->error;
+ io_u_log_error(td, io_u);
+ } else {
+ dprint(FD_IO, "io_completed: errored io_u numberio="
+ "%"PRIu64" for verify (expected)\n",
+ io_u->numberio);
+ }
}
if (icd->error) {
enum error_type_bit eb = td_error_type(ddir, icd->error);
diff --git a/io_u.h b/io_u.h
index 68771eba..0f656ee0 100644
--- a/io_u.h
+++ b/io_u.h
@@ -24,6 +24,8 @@ enum {
IO_U_F_PATTERN_DONE = 1 << 8,
IO_U_F_DEVICE_ERROR = 1 << 9,
IO_U_F_VER_IN_DEV = 1 << 10, /* Verify data in device */
+ IO_U_F_ZEROED = 1 << 11, /* Zeroed data */
+ IO_U_F_ERRORED = 1 << 12, /* Errored offset */
};
/*
diff --git a/iolog.c b/iolog.c
index dcf6083c..df862ea6 100644
--- a/iolog.c
+++ b/iolog.c
@@ -295,6 +295,11 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u)
io_u->ipo = ipo;
+ if (io_u->flags & IO_U_F_ZEROED)
+ ipo->flags |= IP_F_ZEROED;
+ else if (io_u->flags & IO_U_F_ERRORED)
+ ipo->flags |= IP_F_ERRORED;
+
if (io_u_should_trim(td, io_u)) {
flist_add_tail(&ipo->trim_list, &td->trim_list);
td->trim_entries++;
diff --git a/iolog.h b/iolog.h
index b52ae87d..8730427c 100644
--- a/iolog.h
+++ b/iolog.h
@@ -244,6 +244,8 @@ enum {
IP_F_ONLIST = 2,
IP_F_TRIMMED = 4,
IP_F_IN_FLIGHT = 8,
+ IP_F_ZEROED = 16,
+ IP_F_ERRORED = 32,
};
/*
diff --git a/t/nvmept_write_mode.py b/t/nvmept_write_mode.py
index 21a6ea1e..dd8cc045 100755
--- a/t/nvmept_write_mode.py
+++ b/t/nvmept_write_mode.py
@@ -46,7 +46,7 @@ class WriteModeTest(FioJobCmdTest):
f"--filename={self.fio_opts['filename']}",
f"--rw={self.fio_opts['rw']}",
f"--output={self.filenames['output']}",
- f"--output-format={self.fio_opts['output-format']}",
+ f"--output-format={self.fio_opts.get('output-format', 'normal')}",
]
for opt in ['fixedbufs', 'nonvectored', 'force_async', 'registerfiles',
'sqthread_poll', 'sqthread_poll_cpu', 'hipri', 'nowait',
@@ -54,7 +54,7 @@ class WriteModeTest(FioJobCmdTest):
'iodepth', 'iodepth_batch', 'iodepth_batch_complete',
'size', 'rate', 'bs', 'bssplit', 'bsrange', 'randrepeat',
'buffer_pattern', 'verify_pattern', 'verify', 'offset',
- 'filesize', 'write_mode', ]:
+ 'filesize', 'write_mode', 'debug', ]:
if opt in self.fio_opts:
option = f"--{opt}={self.fio_opts[opt]}"
fio_args.append(option)
@@ -68,7 +68,7 @@ class WriteModeTest(FioJobCmdTest):
if 'rw' not in self.fio_opts or \
not self.passed or \
- 'json' not in self.fio_opts['output-format']:
+ 'json' not in self.fio_opts.get('output-format', ''):
return
job = self.json_data['jobs'][0]
@@ -90,7 +90,134 @@ class WriteModeTest(FioJobCmdTest):
logging.error("Unhandled rw value %s", self.fio_opts['rw'])
self.passed = False
-TEST_SIZE="16M"
+nvme_cmd_write = 1
+nvme_cmd_write_uncor = 4
+nvme_cmd_write_zeroes = 8
+nvme_cmd_verify = 12
+
+class WriteModeSplit(WriteModeTest):
+ """
+ Make sure that the expected fraction of write, write uncorrectable, write
+ zeroes, and verify commands are actually submitted.
+ """
+
+ def __init__(self, fio_path, success, testnum, artifact_root, fio_opts, basename=None):
+ super().__init__(fio_path, success, testnum, artifact_root, fio_opts, basename)
+ self.actual = None
+
+ def check_result(self):
+
+ super().check_result()
+
+ if not self.passed:
+ return
+
+ split = {'write': 0, 'uncor': 0, 'verify': 0, 'zeroes': 0}
+ wm = self.fio_opts['write_mode']
+ for s in wm.split(':'):
+ sp = s.split('/')
+ split[sp[0]] = sp[1]
+
+ total = 0
+ blanks = 0
+ for v in split.values():
+ if v == '':
+ blanks += 1
+ else:
+ total += int(v)
+
+ if blanks:
+ fill = int((100 - total) / blanks)
+ for k in split.keys():
+ if split[k] == '':
+ split[k] = fill
+ else:
+ split[k] = int(split[k])
+
+ logging.debug(split)
+
+ self.actual = {'write': 0, 'uncor': 0, 'verify': 0, 'zeroes': 0}
+ with open(self.filenames['output'], 'r') as file:
+ for line in file:
+ if "op selected" in line:
+ op = int(line.split(" op selected ")[1])
+ if op == nvme_cmd_write:
+ self.actual['write'] += 1
+ elif op == nvme_cmd_write_uncor:
+ self.actual['uncor'] += 1
+ elif op == nvme_cmd_write_zeroes:
+ self.actual['zeroes'] += 1
+ elif op == nvme_cmd_verify:
+ self.actual['verify'] += 1
+ else:
+ raise ValueError(f"Unknown opcode {op}")
+
+ logging.debug(self.actual)
+ total = sum(self.actual.values())
+ if total == 0:
+ self.passed = False
+ self.failure_reason += \
+ "No write/uncor/zeroes/verify commands detected"
+ return
+
+ for key, value in self.actual.items():
+ expected = int(split[key] / 100 * total)
+ logging.debug("mode %s: expected %d, actual %d", key, expected, value)
+ if expected != 0:
+ if abs(value - expected) / expected > 0.1:
+ self.passed = False
+ self.failure_reason += \
+ f"large discrepancy for write mode {key}: expected {expected}, actual {value};"
+ elif value != 0:
+ self.passed = False
+ self.failure_reason += \
+ f"discrepancy for write mode {key}: expected {expected}, actual {value};"
+
+
+class WriteModeVerify(WriteModeSplit):
+ """
+ Make sure that offsets that are the target of write uncorrectable commands
+ and offsets that are the target of write zeroes commands are appropriately
+ verified.
+
+ This only checks that the number of write zeroes commands matches the
+ number of write zero verify debug messages and that the number of write
+ uncorrectable commands matches the number of uncorrectable verify debug
+ messages.
+
+ No checking is done to make sure that the offsets where write zeroes
+ (uncorrectables) were originally targeted are the offsets where write zero
+ (uncorrectable) verification is carried out.
+
+ No overlap checking is carried out, so write offsets cannot be repeated.
+
+ Jobs must be run with --debug=verify,io in order to detect errored IOs and
+ write zeroes verification.
+ """
+
+ def check_result(self):
+
+ super().check_result()
+ if not self.passed:
+ return
+
+ verify = {'uncor': 0, 'zeroes': 0}
+ with open(self.filenames['output'], 'r') as file:
+ for line in file:
+ if "errored io_u" in line:
+ verify['uncor'] += 1
+ elif "verifying write zeroes" in line:
+ verify['zeroes'] += 1
+
+ logging.debug("verify: %s", str(verify))
+ for cmd in ['zeroes', 'uncor']:
+ if verify[cmd] != self.actual[cmd]:
+ self.passed = False
+ self.failure_reason += \
+ f"{cmd}: writes {self.actual[cmd]} and verifies {verify[cmd]} do not match; "
+
+
+TEST_SIZE = "16M"
TEST_LIST = [
{
@@ -223,6 +350,164 @@ TEST_LIST = [
"test_class": WriteModeTest,
"success": SUCCESS_NONZERO,
},
+
+ #
+ # Mixed write_mode tests
+ #
+ # test_id 40-41: valid mixed modes, all percentages explicit
+ # test_id 50-53: valid mixed modes, blank percentages (evenly split)
+ # test_id 60-63: invalid mixed modes (parsing should fail)
+ #
+ {
+ # All percentages explicit, sum == 100
+ "test_id": 40,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/30:zeroes/20:uncor/50",
+ "randrepeat": 0,
+ "debug": "io",
+ },
+ "test_class": WriteModeSplit,
+ },
+ {
+ # All percentages explicit with verify; write/50 + zeroes/50
+ "test_id": 41,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/50:zeroes/50",
+ "randrepeat": 0,
+ "debug": "io",
+ },
+ "test_class": WriteModeSplit,
+ },
+
+ {
+ # Blank percentages: write/50 takes half, zeroes and uncor split the
+ # remainder evenly (25% each)
+ "test_id": 50,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/50:zeroes/:uncor/",
+ "randrepeat": 0,
+ "debug": "io",
+ },
+ "test_class": WriteModeSplit,
+ },
+ {
+ # All blanks: write, zeroes, uncor each get 33% (integer division)
+ "test_id": 51,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/:zeroes/:uncor/",
+ "randrepeat": 0,
+ "debug": "io",
+ },
+ "test_class": WriteModeSplit,
+ },
+ {
+ # Two entries, one blank: write/60 + zeroes blank gets remaining 40%
+ "test_id": 52,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/60:zeroes/",
+ "randrepeat": 0,
+ "debug": "io",
+ },
+ "test_class": WriteModeSplit,
+ },
+ {
+ # Three entries, one blank: write/30 + zeroes/40 + uncor blank gets
+ # remaining 30%
+ "test_id": 53,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/30:zeroes/40:uncor/",
+ "randrepeat": 0,
+ "debug": "io",
+ },
+ "test_class": WriteModeSplit,
+ },
+ {
+ # Invalid: percentages exceed 100
+ "test_id": 60,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/60:zeroes/60",
+ },
+ "test_class": WriteModeTest,
+ "success": SUCCESS_NONZERO,
+ },
+ {
+ # Invalid: only one entry (needs at least 2)
+ "test_id": 61,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/100",
+ },
+ "test_class": WriteModeTest,
+ "success": SUCCESS_NONZERO,
+ },
+ {
+ # Invalid: explicit percentages don't add up to 100, no blanks
+ "test_id": 62,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/30:zeroes/30",
+ },
+ "test_class": WriteModeTest,
+ "success": SUCCESS_NONZERO,
+ },
+ {
+ # Invalid: unknown mode name
+ "test_id": 63,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/50:bogus/50",
+ },
+ "test_class": WriteModeTest,
+ "success": SUCCESS_NONZERO,
+ },
+
+ #
+ # Make sure verify handles write zeroes and write uncorrectable opcodes
+ # correctly
+ #
+ {
+ # All percentages explicit, sum == 100
+ "test_id": 70,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/30:zeroes/20:uncor/50",
+ "verify": "crc32c",
+ "randrepeat": 0,
+ "debug": "io,verify",
+ },
+ "test_class": WriteModeVerify,
+ },
+ {
+ # All percentages explicit with verify; write/50 + zeroes/50
+ "test_id": 71,
+ "fio_opts": {
+ "rw": 'randwrite',
+ "filesize": TEST_SIZE,
+ "write_mode": "write/50:zeroes/50",
+ "verify": "crc32c",
+ "randrepeat": 0,
+ "debug": "io,verify",
+ },
+ "test_class": WriteModeVerify,
+ },
]
def parse_args():
@@ -268,11 +553,11 @@ def main():
test['fio_opts']['filename'] = args.dut
test_env = {
- 'fio_path': fio_path,
- 'fio_root': str(Path(__file__).absolute().parent.parent),
- 'artifact_root': artifact_root,
- 'basename': 'nvmept-write-mode',
- }
+ 'fio_path': fio_path,
+ 'fio_root': str(Path(__file__).absolute().parent.parent),
+ 'artifact_root': artifact_root,
+ 'basename': 'nvmept-write-mode',
+ }
_, failed, _ = run_fio_tests(TEST_LIST, test_env, args)
sys.exit(failed)
diff --git a/verify.c b/verify.c
index 7237dc2c..d8312815 100644
--- a/verify.c
+++ b/verify.c
@@ -891,25 +891,30 @@ static int mem_is_zero_slow(const void *data, size_t length, size_t *offset)
return !length;
}
-static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
+static int verify_zero(struct io_u *io_u)
{
size_t offset;
- if (!td->o.trim_zero)
- return 0;
-
if (mem_is_zero(io_u->buf, io_u->buflen))
return 0;
mem_is_zero_slow(io_u->buf, io_u->buflen, &offset);
- log_err("trim: verify failed at file %s offset %llu, length %llu"
+ log_err("verify failed for zeroed data at file %s offset %llu, length %llu"
", block offset %lu\n",
io_u->file->file_name, io_u->verify_offset, io_u->buflen,
(unsigned long) offset);
return EILSEQ;
}
+static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
+{
+ if (!td->o.trim_zero)
+ return 0;
+
+ return verify_zero(io_u);
+}
+
static int verify_header(struct io_u *io_u, struct thread_data *td,
struct verify_header *hdr, unsigned int hdr_num,
unsigned int hdr_len)
@@ -1011,6 +1016,10 @@ int verify_io_u(struct thread_data *td, struct io_u **io_u_ptr)
if (io_u->flags & IO_U_F_TRIMMED) {
ret = verify_trimmed_io_u(td, io_u);
goto done;
+ } else if (io_u->flags & IO_U_F_ZEROED) {
+ dprint(FD_VERIFY, "verifying write zeroes command\n");
+ ret = verify_zero(io_u);
+ goto done;
}
hdr_inc = get_hdr_inc(td, io_u);
@@ -1451,8 +1460,14 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u)
io_u->file = ipo->file;
io_u_set(td, io_u, IO_U_F_VER_LIST);
+ io_u_clear(td, io_u, IO_U_F_TRIMMED | IO_U_F_ZEROED | IO_U_F_ERRORED);
+
if (ipo->flags & IP_F_TRIMMED)
io_u_set(td, io_u, IO_U_F_TRIMMED);
+ else if (ipo->flags & IP_F_ZEROED)
+ io_u_set(td, io_u, IO_U_F_ZEROED);
+ else if (ipo->flags & IP_F_ERRORED)
+ io_u_set(td, io_u, IO_U_F_ERRORED);
if (!fio_file_open(io_u->file)) {
int r = td_io_open_file(td, io_u->file);
next reply other threads:[~2026-06-11 12:00 UTC|newest]
Thread overview: 1519+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-11 12:00 Jens Axboe [this message]
-- strict thread matches above, loose matches on Subject: below --
2026-06-10 12:00 Recent changes (master) 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
2017-07-11 12:00 Jens Axboe
2017-07-08 12:00 Jens Axboe
2017-07-07 12:00 Jens Axboe
2017-07-05 12:00 Jens Axboe
2017-07-04 12:00 Jens Axboe
2017-07-03 12:00 Jens Axboe
2017-06-29 12:00 Jens Axboe
2017-06-28 12:00 Jens Axboe
2017-06-27 12:00 Jens Axboe
2017-06-26 12:00 Jens Axboe
2017-06-24 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=20260611120001.848241BC0156@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.