Recent changes (master)

Jens Axboe
2019-01-13T13:00:12Z

The following changes since commit e0abe38815e1c8cf7a319c6fbd0b1d60691db3d5:

t/io_uring: only set IORING_ENTER_GETEVENTS when actively reaping (2019-01-11 14:40:16 -0700)

are available in the Git repository at:

git://git.kernel.dk/fio.git master

for you to fetch changes up to 8025517dfa599be4bc795e4af7c9012d10b81bc5:

t/io_uring: add IORING_OP_NOP support (2019-01-12 22:14:54 -0700)

----------------------------------------------------------------
Jens Axboe (1):
t/io_uring: add IORING_OP_NOP support

os/io_uring.h | 1 +
t/io_uring.c | 28 +++++++++++++++++++++-------
2 files changed, 22 insertions(+), 7 deletions(-)

---

Diff of recent changes:

diff --git a/os/io_uring.h b/os/io_uring.h
index 74370aed..0f4460d6 100644
--- a/os/io_uring.h
+++ b/os/io_uring.h
@@ -47,6 +47,7 @@ struct io_uring_sqe {
#define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */
#define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */

+#define IORING_OP_NOP 0
#define IORING_OP_READV 1
#define IORING_OP_WRITEV 2
#define IORING_OP_FSYNC 3
diff --git a/t/io_uring.c b/t/io_uring.c
index d4160c3d..8d3f3a9b 100644
--- a/t/io_uring.c
+++ b/t/io_uring.c
@@ -93,6 +93,7 @@ static int fixedbufs = 1; /* use fixed user buffers */
static int buffered = 0; /* use buffered IO, not O_DIRECT */
static int sq_thread_poll = 0; /* use kernel submission/poller thread */
static int sq_thread_cpu = -1; /* pin above thread to this CPU */
+static int do_nop = 0; /* no-op SQ ring commands */

static int io_uring_register_buffers(struct submitter *s)
{
@@ -101,6 +102,9 @@ static int io_uring_register_buffers(struct submitter *s)
.nr_iovecs = DEPTH
};

+ if (do_nop)
+ return 0;
+
return syscall(__NR_sys_io_uring_register, s->ring_fd,
IORING_REGISTER_BUFFERS, &reg);
}
@@ -110,6 +114,9 @@ static int io_uring_register_files(struct submitter *s)
struct io_uring_register_files reg;
int i;

+ if (do_nop)
+ return 0;
+
s->fds = calloc(s->nr_files, sizeof(__s32));
for (i = 0; i < s->nr_files; i++) {
s->fds[i] = s->files[i].real_fd;
@@ -151,6 +158,11 @@ static void init_io(struct submitter *s, unsigned index)
struct file *f;
long r;

+ if (do_nop) {
+ sqe->opcode = IORING_OP_NOP;
+ return;
+ }
+
if (s->nr_files == 1) {
f = &s->files[0];
} else {
@@ -248,11 +260,13 @@ static int reap_events(struct submitter *s)
if (head == *ring->tail)
break;
cqe = &ring->cqes[head & cq_ring_mask];
- f = (struct file *) cqe->user_data;
- f->pending_ios--;
- if (cqe->res != BS) {
- printf("io: unexpected ret=%d\n", cqe->res);
- return -1;
+ if (!do_nop) {
+ f = (struct file *) cqe->user_data;
+ f->pending_ios--;
+ if (cqe->res != BS) {
+ printf("io: unexpected ret=%d\n", cqe->res);
+ return -1;
+ }
}
if (cqe->flags & IOCQE_FLAG_CACHEHIT)
s->cachehit++;
@@ -454,7 +468,7 @@ int main(int argc, char *argv[])
struct rlimit rlim;
void *ret;

- if (argc < 2) {
+ if (!do_nop && argc < 2) {
printf("%s: filename\n", argv[0]);
return 1;
}
@@ -464,7 +478,7 @@ int main(int argc, char *argv[])
flags |= O_DIRECT;

i = 1;
- while (i < argc) {
+ while (!do_nop && i < argc) {
struct file *f = &s->files[s->nr_files];

fd = open(argv[i], flags);