From a7abc9fb769596d3bbf6d779e99d1cb8c1fcd49b Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 10 Jan 2019 22:27:56 -0700 Subject: [PATCH] t/io_uring: add support for registered files Signed-off-by: Jens Axboe --- os/io_uring.h | 10 +++++++++- t/io_uring.c | 26 ++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/os/io_uring.h b/os/io_uring.h index 613930db..e1d3df0b 100644 --- a/os/io_uring.h +++ b/os/io_uring.h @@ -16,7 +16,7 @@ */ struct io_uring_sqe { __u8 opcode; /* type of operation for this sqe */ - __u8 flags; /* as of now unused */ + __u8 flags; /* IOSQE_ flags below */ __u16 ioprio; /* ioprio for the request */ __s32 fd; /* file descriptor to do IO on */ __u64 off; /* offset into file */ @@ -38,6 +38,7 @@ struct io_uring_sqe { * sqe->flags */ #define IOSQE_FIXED_BUFFER (1 << 0) /* use fixed buffer */ +#define IOSQE_FIXED_FILE (1 << 1) /* use fixed fileset */ /* * io_uring_setup() flags @@ -121,10 +122,17 @@ struct io_uring_params { */ #define IORING_REGISTER_BUFFERS 0 #define IORING_UNREGISTER_BUFFERS 1 +#define IORING_REGISTER_FILES 2 +#define IORING_UNREGISTER_FILES 3 struct io_uring_register_buffers { struct iovec *iovecs; unsigned nr_iovecs; }; +struct io_uring_register_files { + int *fds; + unsigned nr_fds; +}; + #endif diff --git a/t/io_uring.c b/t/io_uring.c index 976d4046..0461329b 100644 --- a/t/io_uring.c +++ b/t/io_uring.c @@ -102,6 +102,22 @@ static int io_uring_register_buffers(struct submitter *s) IORING_REGISTER_BUFFERS, ®); } +static int io_uring_register_files(struct submitter *s) +{ + struct io_uring_register_files reg; + int i, ret; + + reg.fds = calloc(s->nr_files, sizeof(int)); + for (i = 0; i < s->nr_files; i++) + reg.fds[i] = s->files[i].fd; + reg.nr_fds = s->nr_files; + + ret = syscall(__NR_sys_io_uring_register, s->ring_fd, + IORING_REGISTER_FILES, ®); + free(reg.fds); + return ret; +} + static int io_uring_setup(unsigned entries, struct io_uring_params *p) { return syscall(__NR_sys_io_uring_setup, entries, p); @@ -146,7 +162,7 @@ static void init_io(struct submitter *s, unsigned index) lrand48_r(&s->rand, &r); offset = (r % (f->max_blocks - 1)) * BS; - sqe->flags = 0; + sqe->flags = IOSQE_FIXED_FILE; sqe->opcode = IORING_OP_READV; if (fixedbufs) { sqe->addr = s->iovecs[index].iov_base; @@ -380,11 +396,17 @@ static int setup_ring(struct submitter *s) if (fixedbufs) { ret = io_uring_register_buffers(s); if (ret < 0) { - perror("io_uring_register"); + perror("io_uring_register_buffers"); return 1; } } + ret = io_uring_register_files(s); + if (ret < 0) { + perror("io_uring_register_files"); + return 1; + } + ptr = mmap(0, p.sq_off.array + p.sq_entries * sizeof(__u32), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQ_RING); -- 2.25.1