From: Jens Axboe <axboe@kernel.dk>
To: <fio@vger.kernel.org>
Subject: Recent changes (master)
Date: Sat, 18 Apr 2026 06:00:02 -0600 [thread overview]
Message-ID: <20260418120002.1B7371BC017C@kernel.dk> (raw)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 40628 bytes --]
The following changes since commit 219f1c3503c1961f41173456d399f41b72d08ef3:
Merge branch 'arm-select-eintr' of https://github.com/alex310110/fio (2026-04-16 10:56:35 -0600)
are available in the Git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to d91ab4439af20b13dbbe55021f6c29de5b6eddeb:
Merge branch 'check-numberio-read-only' of https://github.com/minwooim/fio (2026-04-16 22:31:44 -0400)
----------------------------------------------------------------
Minwoo Im (6):
fio.h: treat io_size > size as offset overlap risk
Revert "backend: fix verify issue during readwrite"
backend: update `total_bytes` for TD_DDIR_WRITE
io_u: check wrap around `f->last_pos` for overlapped case
libfio: reset nr_done_files when io_size > size
t/numberio_overlap: add overlap write verification tests
Vincent Fu (1):
Merge branch 'check-numberio-read-only' of https://github.com/minwooim/fio
backend.c | 7 +-
ci/actions-full-test.sh | 5 +
fio.h | 3 +-
io_u.c | 5 +-
libfio.c | 3 +-
t/numberio_overlap.py | 842 ++++++++++++++++++++++++++++++++++++++++++++++++
t/run-fio-tests.py | 8 +
7 files changed, 865 insertions(+), 8 deletions(-)
create mode 100755 t/numberio_overlap.py
---
Diff of recent changes:
diff --git a/backend.c b/backend.c
index 230d7fd0..cad43ace 100644
--- a/backend.c
+++ b/backend.c
@@ -1104,11 +1104,8 @@ static void do_io(struct thread_data *td, uint64_t *bytes_done)
if (td_write(td) && td_random(td) && td->o.norandommap)
total_bytes = max(total_bytes, (uint64_t) td->o.io_size);
- /*
- * Don't break too early if io_size > size. The exception is when
- * verify is enabled.
- */
- if (td_rw(td) && !td_random(td) && td->o.verify == VERIFY_NONE)
+ /* Don't break too early if io_size > size */
+ if (td_write(td) && !td_random(td))
total_bytes = max(total_bytes, (uint64_t)td->o.io_size);
/*
diff --git a/ci/actions-full-test.sh b/ci/actions-full-test.sh
index 5d6d1ca3..14c2fcf7 100755
--- a/ci/actions-full-test.sh
+++ b/ci/actions-full-test.sh
@@ -32,6 +32,11 @@ main() {
-p
"1010:--skip 15 16 17 18 19 20 21 22"
)
+ # io_uring is unavailable in containers; use psync and libaio instead
+ args+=(
+ -p
+ "1021:--ioengines psync,libaio"
+ )
fi
diff --git a/fio.h b/fio.h
index 8708f048..7793d35c 100644
--- a/fio.h
+++ b/fio.h
@@ -827,7 +827,8 @@ extern void clear_inflight(struct thread_data *);
static inline bool fio_offset_overlap_risk(struct thread_data *td)
{
if (td->o.norandommap || td->o.softrandommap ||
- td->o.ddir_seq_add || (td->o.ddir_seq_nr > 1))
+ td->o.ddir_seq_add || (td->o.ddir_seq_nr > 1) ||
+ td->o.io_size > td->o.size)
return true;
return false;
diff --git a/io_u.c b/io_u.c
index 756aa090..24d8b7de 100644
--- a/io_u.c
+++ b/io_u.c
@@ -382,8 +382,11 @@ static int get_next_seq_offset(struct thread_data *td, struct fio_file *f,
/*
* If we reach the end for a rw-io-size based run, reset us back to 0
* and invalidate the cache, if we need to.
+ *
+ * If it has possibility of overlapped offsets (io_size > size), we
+ * should get back to 0 offset to verify overlapped offsets.
*/
- if (td_rw(td) && o->io_size > o->size) {
+ if (td_write(td) && o->io_size > o->size) {
if (f->last_pos[ddir] >= f->io_size + get_start_offset(td, f)) {
f->last_pos[ddir] = f->file_offset;
loop_cache_invalidate(td, f);
diff --git a/libfio.c b/libfio.c
index 52afeafb..a57ede4f 100644
--- a/libfio.c
+++ b/libfio.c
@@ -106,7 +106,8 @@ static void reset_io_counters(struct thread_data *td, int all)
/*
* reset file done count if we are to start over
*/
- if (td->o.time_based || td->loops > 1 || td->o.do_verify)
+ if (td->o.time_based || td->loops > 1 || td->o.do_verify ||
+ (td->o.io_size > td->o.size))
td->nr_done_files = 0;
}
diff --git a/t/numberio_overlap.py b/t/numberio_overlap.py
new file mode 100755
index 00000000..e8f1419c
--- /dev/null
+++ b/t/numberio_overlap.py
@@ -0,0 +1,842 @@
+#!/usr/bin/env python3
+"""
+# numberio_overlap.py
+#
+# Verification tests for sequential and random write overlap with numberio.
+#
+# When io_size > size, writes wrap around and revisit every offset a second
+# time. fio_offset_overlap_risk() must return true so that io_hist uses an
+# rb-tree and retains only the latest io_piece per offset.
+#
+# Each TC is run twice: once with the async engine and once with the sync
+# engine selected based on the platform (Linux: io_uring/psync,
+# Windows: windowsaio/sync, other: posixaio/psync).
+#
+# rw=write offline TC 1: basic 2× overlap
+# online TC 2: do_verify=1
+#
+# rw=randwrite offline TC 3: norandommap
+# online TC 4: norandommap
+#
+# rw=rw offline TC 5
+# online TC 6
+#
+# rw=randrw offline TC 7: norandommap
+# online TC 8: norandommap
+#
+# filesize<size offline TC 9: rb-tree triggered before first I/O
+#
+# nrfiles=2 offline TC 10: write, 2× overlap across 2 files
+# online TC 11: write, do_verify=1 across 2 files
+# offline TC 12: randwrite, norandommap
+# offline TC 13: write, filesize < size/nrfiles
+#
+# USAGE
+# see python3 t/numberio_overlap.py --help
+#
+# EXAMPLES
+# python3 t/numberio_overlap.py --file /tmp/fio-overlap-test.dat
+# python3 t/numberio_overlap.py --file /tmp/fio-overlap-test.dat -f ./fio
+#
+# REQUIREMENTS
+# Python 3.6
+#
+"""
+import copy
+import os
+import platform
+import sys
+import json
+import time
+import locale
+import logging
+import argparse
+import subprocess
+from pathlib import Path
+from fiotestlib import FioJobCmdTest, run_fio_tests
+from fiotestcommon import SUCCESS_DEFAULT, Requirements
+
+
+class OfflineOverlapVerifyTest(FioJobCmdTest):
+ """
+ Two-phase offline overlap verification test.
+
+ Phase 1 — write:
+ rw=write, io_size = N * size (N >= 2).
+ Every offset is written N times; the N-th pass has the highest numberio.
+ fio_offset_overlap_risk() must return true so that the rb-tree backend
+ is used and only the latest io_piece per offset is kept.
+
+ Phase 2 — verify:
+ verify_only=1, verify_state_load=1.
+ A dry-run write pass detects overlaps ("iolog: overlap") and advances
+ f->last_pos to wrap back to 0. The subsequent READ phase issues exactly
+ (size / bs) reads — one per block — checking the latest numberio only.
+
+ Key assertions
+ - Write phase exits 0 and produces io_size bytes written.
+ - Verify phase exits 0 and reports 0 verify_errors.
+ - Verify phase reads exactly size bytes — not io_size bytes — confirming
+ that only the latest numberio is verified once per block.
+ """
+
+ def __init__(self, fio_path, success, testnum, artifact_root, fio_opts,
+ basename=None):
+ super().__init__(fio_path, success, testnum, artifact_root, fio_opts,
+ basename)
+ stub = os.path.join(self.paths['test_dir'],
+ f"{self.basename}{self.testnum:03d}")
+ # write-phase output file (verify phase reuses self.filenames['output'])
+ self.filenames['output_write'] = os.path.abspath(f"{stub}.write.output")
+
+ def setup(self, parameters):
+ """Create test directory; args are built dynamically in run()."""
+ if not os.path.exists(self.paths['test_dir']):
+ os.mkdir(self.paths['test_dir'])
+ self.parameters = [] # satisfy FioExeTest.run() if it ever gets called
+
+ def _filename_str(self):
+ """Return the fio --filename value: colon-joined list for nrfiles > 1."""
+ base = self.fio_opts['filename']
+ nrfiles = self.fio_opts.get('nrfiles', 1)
+ if nrfiles > 1:
+ return ':'.join(f"{base}.{i}" for i in range(nrfiles))
+ return base
+
+ def _fio_args(self, phase):
+ """Return fio CLI args for *phase* ('write' or 'verify')."""
+
+ ioengine = self.fio_opts.get('ioengine', 'io_uring')
+
+ fallocate = "--fallocate=truncate"
+
+ common = [
+ "--name=overlap-verify",
+ f"--ioengine={ioengine}",
+ fallocate,
+ ]
+
+ rw = self.fio_opts.get('rw', 'write')
+
+ common += [
+ f"--filename={self._filename_str()}",
+ f"--bs={self.fio_opts['bs']}",
+ f"--size={self.fio_opts['size']}",
+ f"--io_size={self.fio_opts['io_size']}",
+ f"--verify={self.fio_opts['verify']}",
+ "--output-format=json",
+ ]
+
+ if self.fio_opts.get('norandommap'):
+ common.append("--norandommap=1")
+
+ if phase == 'write':
+ return common + [
+ f"--rw={rw}",
+ "--do_verify=0",
+ f"--output={self.filenames['output_write']}",
+ ]
+ else:
+ # Verify phase replays the same rw mode as the write phase so that
+ # do_dry_run produces an identical offset→numberio mapping.
+ # - randwrite/randrw with norandommap=1: no axmap limit so
+ # do_dry_run runs to io_size. Both phases use the same RNG
+ # sequence because randrepeat=1 is fio's default (options.c
+ # ".def = 1"), giving identical offset→numberio in io_hist.
+ # - rw/randrw (sequential/random mixed): IOs advance position the
+ # same way in write and verify phases; only writes go to io_hist.
+ verify_io_size = self.fio_opts.get('verify_io_size',
+ self.fio_opts['io_size'])
+ verify_args = [
+ "--name=overlap-verify",
+ f"--ioengine={ioengine}",
+ fallocate,
+ f"--filename={self._filename_str()}",
+ f"--rw={rw}",
+ f"--bs={self.fio_opts['bs']}",
+ f"--size={self.fio_opts['size']}",
+ f"--io_size={verify_io_size}",
+ f"--verify={self.fio_opts['verify']}",
+ "--output-format=json",
+ "--do_verify=1",
+ "--verify_only=1",
+ "--verify_write_sequence=1",
+ f"--output={self.filenames['output']}",
+ ]
+ if self.fio_opts.get('norandommap'):
+ verify_args.append("--norandommap=1")
+ return verify_args
+
+ def _run_one(self, args, stdout_f, stderr_f, ec_f):
+ """Spawn fio with *args* in test_dir; return the Popen object."""
+ command = [self.paths['exe']] + args
+ with open(self.filenames['cmd'], "a",
+ encoding=locale.getpreferredencoding()) as cmd_f:
+ cmd_f.write(" \\\n ".join(command) + "\n\n")
+ proc = subprocess.Popen(command,
+ stdout=stdout_f,
+ stderr=stderr_f,
+ cwd=self.paths['test_dir'],
+ universal_newlines=True)
+ proc.communicate(timeout=self.success['timeout'])
+ ec_f.write(f"{proc.returncode}\n")
+ logging.debug("Test %d phase %s: exit %d",
+ self.testnum, args[-1], proc.returncode)
+ return proc
+
+ def run(self):
+ """Run write phase then verify phase sequentially."""
+
+ # If filesize is specified, pre-create each file at that size so that
+ # real_file_size < size/nrfiles, which is the scenario under test.
+ if 'filesize' in self.fio_opts:
+ base = self.fio_opts['filename']
+ nrfiles = self.fio_opts.get('nrfiles', 1)
+ fnames = [f"{base}.{i}" for i in range(nrfiles)] if nrfiles > 1 \
+ else [base]
+ for fname in fnames:
+ with open(fname, 'wb'):
+ pass
+ os.truncate(fname, self.fio_opts['filesize'])
+
+ try:
+ with open(self.filenames['stdout'], "w",
+ encoding=locale.getpreferredencoding()) as stdout_f, \
+ open(self.filenames['stderr'], "w",
+ encoding=locale.getpreferredencoding()) as stderr_f, \
+ open(self.filenames['exitcode'], "w",
+ encoding=locale.getpreferredencoding()) as ec_f:
+
+ proc_w = self._run_one(self._fio_args('write'),
+ stdout_f, stderr_f, ec_f)
+ if proc_w.returncode != 0:
+ self.output['proc'] = proc_w
+ self.output['failure'] = \
+ f"write phase exited with {proc_w.returncode}"
+ return
+
+ proc_v = self._run_one(self._fio_args('verify'),
+ stdout_f, stderr_f, ec_f)
+ self.output['proc'] = proc_v
+
+ except subprocess.TimeoutExpired:
+ self.output['failure'] = 'timeout'
+ except Exception:
+ self.output['failure'] = 'exception'
+ self.output['exc_info'] = sys.exc_info()
+
+ @staticmethod
+ def _load_json(path):
+ """Return parsed JSON from a fio output file, or None on error."""
+ try:
+ with open(path, "r", encoding=locale.getpreferredencoding()) as f:
+ raw = f.read()
+ lines = raw.splitlines()
+ last = len(lines) - lines[::-1].index("}")
+ return json.loads("\n".join(lines[lines.index("{"):last]))
+ except Exception as exc:
+ logging.debug("JSON parse error in %s: %s", path, exc)
+ return None
+
+ def check_result(self):
+ """Check both phases produced the expected byte counts."""
+
+ # basic exit-code / stderr checks via FioExeTest
+ if 'proc' not in self.output:
+ self.failure_reason = self.output.get('failure', 'did not run')
+ self.passed = False
+ return
+
+ if 'failure' in self.output:
+ self.failure_reason = self.output['failure']
+ self.passed = False
+ # still fall through to check JSON if proc is set
+
+ if self.output['proc'].returncode != 0:
+ self.failure_reason += (
+ f" verify phase exited with {self.output['proc'].returncode}")
+ self.passed = False
+
+ # --- write phase: must have issued io_size bytes total ---
+ # For write-only modes (write, randwrite): all bytes are writes.
+ # For mixed modes (rw, randrw): writes + reads together equal io_size.
+ jw = self._load_json(self.filenames['output_write'])
+ if not jw:
+ self.failure_reason += " cannot parse write-phase JSON"
+ self.passed = False
+ else:
+ job_w = jw['jobs'][0]
+ written = job_w['write']['io_bytes']
+ rw = self.fio_opts.get('rw', 'write')
+ if rw in ('rw', 'readwrite', 'randrw'):
+ total_issued = written + job_w['read']['io_bytes']
+ if total_issued != self.fio_opts['io_size']:
+ self.failure_reason += (
+ f" write phase: issued {total_issued} bytes "
+ f"(write={written} read={job_w['read']['io_bytes']}), "
+ f"expected {self.fio_opts['io_size']} total")
+ self.passed = False
+ logging.debug("write job: %s",
+ json.dumps(job_w, indent=2))
+ else:
+ if written != self.fio_opts['io_size']:
+ self.failure_reason += (
+ f" write phase: wrote {written} bytes, "
+ f"expected {self.fio_opts['io_size']}")
+ self.passed = False
+ logging.debug("write job: %s",
+ json.dumps(job_w, indent=2))
+
+ # --- verify phase: no errors, reads exactly size bytes ---
+ jv = self._load_json(self.filenames['output'])
+ if not jv:
+ self.failure_reason += " cannot parse verify-phase JSON"
+ self.passed = False
+ else:
+ job = jv['jobs'][0]
+ read_data = job.get('read', {})
+
+ verify_errors = read_data.get('verify_errors', 0)
+ if verify_errors != 0:
+ self.failure_reason += (
+ f" verify phase: {verify_errors} verify error(s)")
+ self.passed = False
+
+ # For sequential write-only modes (write) every block is written
+ # exactly once per pass, so verify reads exactly size bytes.
+ # Skip the assertion for:
+ # - mixed modes (rw, randrw): only written blocks are in io_hist
+ # - norandommap: random sampling may leave some blocks unvisited
+ rw_mode = self.fio_opts.get('rw', 'write')
+ if rw_mode not in ('rw', 'readwrite', 'randrw') \
+ and not self.fio_opts.get('norandommap'):
+ expected_read = self.fio_opts['size']
+ read_bytes = read_data.get('io_bytes', 0)
+ if read_bytes != expected_read:
+ self.failure_reason += (
+ f" verify phase: read {read_bytes} bytes, "
+ f"expected {expected_read} "
+ f"(one pass — latest numberio only)")
+ self.passed = False
+ logging.debug("verify job: %s", json.dumps(job, indent=2))
+
+
+class OnlineOverlapVerifyTest(FioJobCmdTest):
+ """
+ Single-phase online overlap verification test (--do_verify=1).
+
+ fio writes and verifies in the same job. With io_size > size the write
+ phase makes multiple passes over the file (or revisits offsets with
+ norandommap); the verify (read) phase runs after all writes, checking
+ only the latest numberio per block.
+
+ This exercises:
+ - fio_offset_overlap_risk() enabling the rb-tree io_hist when
+ io_size > size, for all rw modes (write, randwrite, rw, randrw).
+ - backend.c: total_bytes for sequential write-only jobs is now bounded
+ by io_size (not size), so the second write pass actually happens.
+ - io_u.c: last_pos wrap-around is now triggered by do_verify=1 (not
+ only verify_only=1), so the verify READ phase starts from offset 0.
+
+ Key assertions
+ rw=write / rw=randwrite (TC 9-10, 17-18):
+ write == io_size (all overlap passes completed)
+ read == size (one verify pass — latest numberio only)
+ verify_errors == 0
+ rw=rw / rw=randrw (TC 19-22):
+ verify_errors == 0 only — write and read byte counts are skipped
+ because mixed I/O means write.io_bytes < io_size (50 % writes)
+ and read.io_bytes includes both the rw= read IOs and the verify
+ reads, making an exact assertion impractical.
+ """
+
+ def setup(self, parameters):
+ """Create test directory; args are built dynamically in run()."""
+ if not os.path.exists(self.paths['test_dir']):
+ os.mkdir(self.paths['test_dir'])
+ self.parameters = []
+
+ def _filename_str(self):
+ """Return the fio --filename value: colon-joined list for nrfiles > 1."""
+ base = self.fio_opts['filename']
+ nrfiles = self.fio_opts.get('nrfiles', 1)
+ if nrfiles > 1:
+ return ':'.join(f"{base}.{i}" for i in range(nrfiles))
+ return base
+
+ def _fio_args(self):
+ ioengine = self.fio_opts.get('ioengine', 'io_uring')
+ rw = self.fio_opts.get('rw', 'write')
+ args = [
+ "--name=online-overlap-verify",
+ f"--ioengine={ioengine}",
+ "--fallocate=truncate",
+ f"--filename={self._filename_str()}",
+ f"--rw={rw}",
+ f"--bs={self.fio_opts['bs']}",
+ f"--size={self.fio_opts['size']}",
+ f"--io_size={self.fio_opts['io_size']}",
+ f"--verify={self.fio_opts['verify']}",
+ "--do_verify=1",
+ "--verify_write_sequence=1",
+ "--output-format=json",
+ f"--output={self.filenames['output']}",
+ ]
+ if self.fio_opts.get('norandommap'):
+ args.append("--norandommap=1")
+ return args
+
+ def _run_one(self, args, stdout_f, stderr_f, ec_f):
+ command = [self.paths['exe']] + args
+ with open(self.filenames['cmd'], "w",
+ encoding=locale.getpreferredencoding()) as cmd_f:
+ cmd_f.write(" \\\n ".join(command) + "\n")
+ proc = subprocess.Popen(command,
+ stdout=stdout_f,
+ stderr=stderr_f,
+ cwd=self.paths['test_dir'],
+ universal_newlines=True)
+ proc.communicate(timeout=self.success['timeout'])
+ ec_f.write(f"{proc.returncode}\n")
+ logging.debug("Test %d online: exit %d", self.testnum, proc.returncode)
+ return proc
+
+ def run(self):
+ try:
+ with open(self.filenames['stdout'], "w",
+ encoding=locale.getpreferredencoding()) as stdout_f, \
+ open(self.filenames['stderr'], "w",
+ encoding=locale.getpreferredencoding()) as stderr_f, \
+ open(self.filenames['exitcode'], "w",
+ encoding=locale.getpreferredencoding()) as ec_f:
+ proc = self._run_one(self._fio_args(), stdout_f, stderr_f, ec_f)
+ self.output['proc'] = proc
+ except subprocess.TimeoutExpired:
+ self.output['failure'] = 'timeout'
+ except Exception:
+ self.output['failure'] = 'exception'
+ self.output['exc_info'] = sys.exc_info()
+
+ @staticmethod
+ def _load_json(path):
+ try:
+ with open(path, "r", encoding=locale.getpreferredencoding()) as f:
+ raw = f.read()
+ lines = raw.splitlines()
+ last = len(lines) - lines[::-1].index("}")
+ return json.loads("\n".join(lines[lines.index("{"):last]))
+ except Exception as exc:
+ logging.debug("JSON parse error in %s: %s", path, exc)
+ return None
+
+ def check_result(self):
+ if 'proc' not in self.output:
+ self.failure_reason = self.output.get('failure', 'did not run')
+ self.passed = False
+ return
+
+ if 'failure' in self.output:
+ self.failure_reason = self.output['failure']
+ self.passed = False
+
+ if self.output['proc'].returncode != 0:
+ self.failure_reason += (
+ f" job exited with {self.output['proc'].returncode}")
+ self.passed = False
+
+ jv = self._load_json(self.filenames['output'])
+ if not jv:
+ self.failure_reason += " cannot parse JSON"
+ self.passed = False
+ return
+
+ job = jv['jobs'][0]
+
+ verify_errors = job.get('read', {}).get('verify_errors', 0)
+ if verify_errors != 0:
+ self.failure_reason += f" {verify_errors} verify error(s)"
+ self.passed = False
+
+ rw_mode = self.fio_opts.get('rw', 'write')
+ is_mixed = rw_mode in ('rw', 'readwrite', 'randrw')
+ has_norandommap = self.fio_opts.get('norandommap', False)
+
+ # For mixed modes (rw, randrw): write.io_bytes < io_size (50 % writes)
+ # and read.io_bytes merges write-phase reads with verify reads.
+ # For write-only modes: assert written == io_size.
+ if not is_mixed:
+ written = job.get('write', {}).get('io_bytes', 0)
+ if written != self.fio_opts['io_size']:
+ self.failure_reason += (
+ f" wrote {written} bytes, expected {self.fio_opts['io_size']}"
+ f" (both overlap passes must complete)")
+ self.passed = False
+ logging.debug("job: %s", json.dumps(job, indent=2))
+
+ # For norandommap: random sampling may not cover all blocks, so
+ # read_bytes may be less than size. Skip the assertion in that case.
+ if not is_mixed and not has_norandommap:
+ read_bytes = job.get('read', {}).get('io_bytes', 0)
+ if read_bytes != self.fio_opts['size']:
+ self.failure_reason += (
+ f" verify read {read_bytes} bytes, expected {self.fio_opts['size']}"
+ f" (one pass — latest numberio only)")
+ self.passed = False
+ logging.debug("job: %s", json.dumps(job, indent=2))
+
+
+TEST_LIST = [
+ # ══════════════════════════════════════════════════════════════════
+ # rw=write (TC 1-2)
+ # ══════════════════════════════════════════════════════════════════
+
+ # write, offline (TC 1): basic 2× overlap (io_size = 2 × size)
+ # 8 blocks written twice; verify reads each once.
+ {
+ "test_id": 1,
+ "fio_opts": {
+ "filename": None, # filled in from --file at runtime
+ "bs": "128k",
+ "size": 1 * 1024 * 1024, # 1 MiB
+ "io_size": 2 * 1024 * 1024, # 2 MiB → 2× overlap
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # write, online (TC 2): do_verify=1, 2× overlap.
+ # Exercises the backend.c fix (total_bytes bounded by io_size for
+ # sequential write-only jobs) and the io_u.c fix (last_pos wrap
+ # triggered by do_verify=1, not only verify_only=1).
+ {
+ "test_id": 2,
+ "fio_opts": {
+ "filename": None,
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 2 * 1024 * 1024,
+ "verify": "crc32c",
+ },
+ "test_class": OnlineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # ══════════════════════════════════════════════════════════════════
+ # rw=randwrite (TC 3-4)
+ # norandommap=1 allows the RNG to revisit the same offsets (genuine
+ # write overlap) and avoids the axmap-full problem in do_dry_run.
+ # Both offline and online phases use fio's default randrepeat=1, so
+ # write and verify dry-run see the same random offset sequence.
+ # ══════════════════════════════════════════════════════════════════
+
+ # randwrite, offline (TC 3): norandommap, offline verify.
+ {
+ "test_id": 3,
+ "fio_opts": {
+ "filename": None,
+ "rw": "randwrite",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 2 * 1024 * 1024,
+ "norandommap": True,
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # randwrite, online (TC 4): norandommap, online verify.
+ # total_bytes=io_size so the full 2M is written in one do_io() call;
+ # random offsets may be revisited (genuine overlap).
+ # verify_errors==0 and written==io_size are asserted; read_bytes is
+ # skipped because random sampling may not cover every block.
+ {
+ "test_id": 4,
+ "fio_opts": {
+ "filename": None,
+ "rw": "randwrite",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 2 * 1024 * 1024,
+ "norandommap": True,
+ "verify": "crc32c",
+ },
+ "test_class": OnlineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # ══════════════════════════════════════════════════════════════════
+ # rw=rw (sequential mixed read/write) (TC 5-6)
+ # io_size=4×size; with 50/50 rwmix the write fraction gives overlap.
+ # total_bytes=size per outer iteration → 4 iters → write overlap.
+ # Only verify_errors==0 is asserted; byte-count assertions skipped
+ # because write.io_bytes < io_size and read.io_bytes merges phases.
+ # ══════════════════════════════════════════════════════════════════
+
+ # rw=rw, offline (TC 5): both phases use rw=rw so the dry-run produces
+ # the same offset→numberio mapping (writes at even-numbered offsets only).
+ {
+ "test_id": 5,
+ "fio_opts": {
+ "filename": None,
+ "rw": "rw",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 4 * 1024 * 1024,
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # rw=rw, online (TC 6).
+ {
+ "test_id": 6,
+ "fio_opts": {
+ "filename": None,
+ "rw": "rw",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 4 * 1024 * 1024,
+ "verify": "crc32c",
+ },
+ "test_class": OnlineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # ══════════════════════════════════════════════════════════════════
+ # rw=randrw (random mixed read/write) (TC 7-8)
+ # norandommap=1 allows offsets to be revisited (genuine overlap) and
+ # avoids the axmap-full problem in do_dry_run (offline) / do_io (online).
+ # fio's default randrepeat=1 ensures both phases replay the same mixed
+ # I/O sequence so the dry-run io_hist matches the write phase.
+ # ══════════════════════════════════════════════════════════════════
+
+ # randrw, offline (TC 7): norandommap, offline verify.
+ {
+ "test_id": 7,
+ "fio_opts": {
+ "filename": None,
+ "rw": "randrw",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 4 * 1024 * 1024,
+ "norandommap": True,
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # randrw, online (TC 8): norandommap, online verify.
+ # Only verify_errors==0 is asserted.
+ {
+ "test_id": 8,
+ "fio_opts": {
+ "filename": None,
+ "rw": "randrw",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 4 * 1024 * 1024,
+ "norandommap": True,
+ "verify": "crc32c",
+ },
+ "test_class": OnlineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # ══════════════════════════════════════════════════════════════════
+ # filesize < size (TC 9)
+ # Real file size smaller than size=: fio_offset_overlap_risk() returns
+ # true (io_size > real_file_size) so the rb-tree is used even before
+ # the first write. Covers the case where the rb-tree is initialised
+ # at setup time rather than at the first overlap.
+ # ══════════════════════════════════════════════════════════════════
+
+ # write, offline, filesize < size (TC 9):
+ # filesize=512k < size=1M, io_size=2M → 2× overlap over 1M.
+ {
+ "test_id": 9,
+ "fio_opts": {
+ "filename": None,
+ "bs": "128k",
+ "filesize": 512 * 1024, # initial file size (< size)
+ "size": 1 * 1024 * 1024, # 1 MiB > filesize
+ "io_size": 2 * 1024 * 1024, # 2 MiB → io_size > size → rb-tree
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # ══════════════════════════════════════════════════════════════════
+ # Multiple files (nrfiles=2) (TC 10-13)
+ #
+ # With nrfiles=2 fio distributes I/O across two files. Each file
+ # receives size/2 bytes of address space and io_size/2 of I/O,
+ # giving 2× overlap per file. fio_offset_overlap_risk() fires at
+ # the job level (io_size > size), so the rb-tree is used for the
+ # shared io_hist. nr_done_files is reset when io_size > size so
+ # that fio continues I/O after visiting every file once.
+ #
+ # Assertions are identical to the single-file cases:
+ # write.io_bytes == io_size (total across both files)
+ # read.io_bytes == size (one verify pass per file, total)
+ # ══════════════════════════════════════════════════════════════════
+
+ # nrfiles=2, write, offline (TC 10): basic 2× overlap across 2 files.
+ {
+ "test_id": 10,
+ "fio_opts": {
+ "filename": None,
+ "nrfiles": 2,
+ "bs": "128k",
+ "size": 1 * 1024 * 1024, # 1 MiB total (512k per file)
+ "io_size": 2 * 1024 * 1024, # 2 MiB total → 2× overlap per file
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # nrfiles=2, write, online (TC 11): do_verify=1 across 2 files.
+ {
+ "test_id": 11,
+ "fio_opts": {
+ "filename": None,
+ "nrfiles": 2,
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 2 * 1024 * 1024,
+ "verify": "crc32c",
+ },
+ "test_class": OnlineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # nrfiles=2, randwrite, norandommap, offline (TC 12).
+ # Random writes distribute across both files via file_service_type;
+ # norandommap=1 allows offsets within each file to be revisited.
+ # read.io_bytes assertion is skipped (norandommap may not cover all blocks).
+ {
+ "test_id": 12,
+ "fio_opts": {
+ "filename": None,
+ "nrfiles": 2,
+ "rw": "randwrite",
+ "bs": "128k",
+ "size": 1 * 1024 * 1024,
+ "io_size": 2 * 1024 * 1024,
+ "norandommap": True,
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+
+ # nrfiles=2, write, offline, filesize < size/nrfiles (TC 13).
+ # Each file is pre-created at 256k (< size/2 = 512k), so
+ # real_file_size < size/nrfiles at setup → rb-tree initialised before
+ # the first I/O (exercises the early-init path alongside TC 9).
+ {
+ "test_id": 13,
+ "fio_opts": {
+ "filename": None,
+ "nrfiles": 2,
+ "bs": "128k",
+ "filesize": 256 * 1024, # pre-created size per file (< size/2)
+ "size": 1 * 1024 * 1024, # 1 MiB total → 512k per file > filesize
+ "io_size": 2 * 1024 * 1024, # 2 MiB total → 2× overlap per file
+ "verify": "crc32c",
+ },
+ "test_class": OfflineOverlapVerifyTest,
+ "success": SUCCESS_DEFAULT,
+ },
+]
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(
+ description="Offline overlap verify test for fio numberio")
+ parser.add_argument('-f', '--fio',
+ help='path to fio executable (default: ./fio)')
+ parser.add_argument('-a', '--artifact-root',
+ help='root directory for test artifacts')
+ parser.add_argument('-d', '--debug', action='store_true',
+ help='enable debug messages')
+ parser.add_argument('-s', '--skip', nargs='+', type=int,
+ help='test IDs to skip')
+ parser.add_argument('-o', '--run-only', nargs='+', type=int,
+ help='run only these test IDs')
+ parser.add_argument('-k', '--skip-req', action='store_true',
+ help='skip requirements checking')
+ parser.add_argument('--file',
+ default='fio-numberio-overlap-test.dat',
+ help='file path for all TCs '
+ '(default: fio-numberio-overlap-test.dat in cwd). '
+ 'WARNING: data will be overwritten',
+ dest='file')
+ parser.add_argument('--ioengines',
+ default=None,
+ help='comma-separated list of ioengines to test '
+ '(default: platform-specific async,sync pair, '
+ 'e.g. --ioengines psync,libaio)')
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=logging.DEBUG if args.debug else logging.INFO)
+
+ artifact_root = args.artifact_root or \
+ f"numberio-overlap-test-{time.strftime('%Y%m%d-%H%M%S')}"
+ os.mkdir(artifact_root)
+ print(f"Artifact directory: {artifact_root}")
+
+ fio_path = str(Path(args.fio).absolute()) if args.fio else \
+ os.path.join(os.path.dirname(__file__), '../fio')
+ print(f"fio path: {fio_path}")
+
+ fio_root = str(Path(__file__).absolute().parent.parent)
+
+ if not args.skip_req:
+ Requirements(fio_root, args)
+
+ for test in TEST_LIST:
+ test['fio_opts']['filename'] = args.file
+
+ if args.ioengines:
+ engines = [e.strip() for e in args.ioengines.split(',')]
+ elif platform.system() == 'Linux':
+ engines = ['io_uring', 'psync']
+ elif platform.system() == 'Windows':
+ engines = ['windowsaio', 'sync']
+ else:
+ engines = ['posixaio', 'psync']
+
+ total_failed = 0
+ for engine in engines:
+ engine_tests = copy.deepcopy(TEST_LIST)
+ for test in engine_tests:
+ test['fio_opts']['ioengine'] = engine
+
+ engine_artifact = os.path.join(artifact_root, engine)
+ os.mkdir(engine_artifact)
+
+ test_env = {
+ 'fio_path': fio_path,
+ 'fio_root': fio_root,
+ 'artifact_root': engine_artifact,
+ 'basename': 'numberio-overlap',
+ }
+
+ print(f"\nRunning with ioengine={engine}")
+ _, failed, _ = run_fio_tests(engine_tests, test_env, args)
+ total_failed += failed
+
+ sys.exit(total_failed)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/t/run-fio-tests.py b/t/run-fio-tests.py
index b3321312..c3545dd6 100755
--- a/t/run-fio-tests.py
+++ b/t/run-fio-tests.py
@@ -1139,6 +1139,14 @@ TEST_LIST = [
'success': SUCCESS_DEFAULT,
'requirements': [Requirements.not_windows],
},
+ {
+ 'test_id': 1021,
+ 'test_class': FioExeTest,
+ 'exe': 't/numberio_overlap.py',
+ 'parameters': ['-f', '{fio_path}'],
+ 'success': SUCCESS_DEFAULT,
+ 'requirements': [],
+ },
]
next reply other threads:[~2026-04-18 12:00 UTC|newest]
Thread overview: 1461+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-18 12:00 Jens Axboe [this message]
-- strict thread matches above, loose matches on Subject: below --
2026-04-17 12:00 Recent changes (master) 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-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-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-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-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-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-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
2017-06-23 12:00 Jens Axboe
2017-06-20 12:00 Jens Axboe
2017-06-19 12:00 Jens Axboe
2017-06-16 12:00 Jens Axboe
2017-06-15 12:00 Jens Axboe
2017-06-13 12:00 Jens Axboe
2017-06-09 12:00 Jens Axboe
2017-06-08 12:00 Jens Axboe
2017-06-06 12:00 Jens Axboe
2017-06-03 12:00 Jens Axboe
2017-05-27 12:00 Jens Axboe
2017-05-25 12:00 Jens Axboe
2017-05-24 12:00 Jens Axboe
2017-05-23 12:00 Jens Axboe
2017-05-20 12:00 Jens Axboe
2017-05-19 12:00 Jens Axboe
2017-05-10 12:00 Jens Axboe
2017-05-05 12:00 Jens Axboe
2017-05-04 12:00 Jens Axboe
2017-05-02 12:00 Jens Axboe
2017-05-01 12:00 Jens Axboe
2017-04-27 12:00 Jens Axboe
2017-04-26 12:00 Jens Axboe
2017-04-20 12:00 Jens Axboe
2017-04-11 12:00 Jens Axboe
2017-04-09 12:00 Jens Axboe
2017-04-08 12:00 Jens Axboe
2017-04-05 12:00 Jens Axboe
2017-04-04 12:00 Jens Axboe
2017-04-03 12:00 Jens Axboe
2017-03-29 12:00 Jens Axboe
2017-03-22 12:00 Jens Axboe
2017-03-20 12:00 Jens Axboe
2017-03-18 12:00 Jens Axboe
2017-03-17 12:00 Jens Axboe
2017-03-15 12:00 Jens Axboe
2017-03-14 12:00 Jens Axboe
2017-03-13 12:00 Jens Axboe
2017-03-11 13:00 Jens Axboe
2017-03-09 13:00 Jens Axboe
2017-03-08 13: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=20260418120002.1B7371BC017C@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox