Update to newer API

- Fixed buffers are now available through io_uring_register()
- Various thread/wq options are now dead and automatic instead
- sqe->index is now sqe->buf_index
- Fixed buffers require flag, not separate opcode

Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Jens Axboe
2019-01-10 14:28:10 -07:00
parent 6cdce17753
commit d5b4ae1c58
6 changed files with 43 additions and 23 deletions

View File

@@ -189,12 +189,11 @@ err:
* contains the necessary information to read/write to the rings. * contains the necessary information to read/write to the rings.
*/ */
int io_uring_queue_init(unsigned entries, struct io_uring_params *p, int io_uring_queue_init(unsigned entries, struct io_uring_params *p,
struct iovec *iovecs, unsigned nr_iovecs,
struct io_uring *ring) struct io_uring *ring)
{ {
int fd, ret; int fd, ret;
fd = io_uring_setup(entries, iovecs, nr_iovecs, p); fd = io_uring_setup(entries, p);
if (fd < 0) if (fd < 0)
return fd; return fd;

View File

@@ -29,25 +29,27 @@ struct io_uring_sqe {
__kernel_rwf_t rw_flags; __kernel_rwf_t rw_flags;
__u32 __resv; __u32 __resv;
}; };
__u16 index; /* index into fixed buffers, if used */ __u16 buf_index; /* index into fixed buffers, if used */
__u16 __pad2[3]; __u16 __pad2[3];
__u64 data; /* data to be passed back at completion time */ __u64 data; /* data to be passed back at completion time */
}; };
/*
* sqe->flags
*/
#define IOSQE_FIXED_BUFFER (1 << 0) /* use fixed buffer */
/* /*
* io_uring_setup() flags * io_uring_setup() flags
*/ */
#define IORING_SETUP_IOPOLL (1 << 0) /* io_context is polled */ #define IORING_SETUP_IOPOLL (1 << 0) /* io_context is polled */
#define IORING_SETUP_SQTHREAD (1 << 1) /* Use SQ thread */ #define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */
#define IORING_SETUP_SQWQ (1 << 2) /* Use SQ workqueue */ #define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */
#define IORING_SETUP_SQPOLL (1 << 3) /* SQ thread polls */
#define IORING_OP_READV 1 #define IORING_OP_READV 1
#define IORING_OP_WRITEV 2 #define IORING_OP_WRITEV 2
#define IORING_OP_FSYNC 3 #define IORING_OP_FSYNC 3
#define IORING_OP_FDSYNC 4 #define IORING_OP_FDSYNC 4
#define IORING_OP_READ_FIXED 5
#define IORING_OP_WRITE_FIXED 6
/* /*
* IO completion data structure (Completion Queue Entry) * IO completion data structure (Completion Queue Entry)
@@ -114,4 +116,15 @@ struct io_uring_params {
struct io_cqring_offsets cq_off; struct io_cqring_offsets cq_off;
}; };
/*
* io_uring_register(2) opcodes and arguments
*/
#define IORING_REGISTER_BUFFERS 0
#define IORING_UNREGISTER_BUFFERS 1
struct io_uring_register_buffers {
struct iovec *iovecs;
unsigned nr_iovecs;
};
#endif #endif

View File

@@ -43,16 +43,16 @@ struct io_uring {
/* /*
* System calls * System calls
*/ */
extern int io_uring_setup(unsigned entries, struct iovec *iovecs, extern int io_uring_setup(unsigned entries, struct io_uring_params *p);
unsigned nr_iovecs, struct io_uring_params *p);
extern int io_uring_enter(unsigned fd, unsigned to_submit, extern int io_uring_enter(unsigned fd, unsigned to_submit,
unsigned min_complete, unsigned flags); unsigned min_complete, unsigned flags);
extern int io_uring_register(int fd, unsigned int opcode, void *arg);
/* /*
* Library interface * Library interface
*/ */
extern int io_uring_queue_init(unsigned entries, struct io_uring_params *p, extern int io_uring_queue_init(unsigned entries, struct io_uring_params *p,
struct iovec *iovecs, unsigned nr_iovecs, struct io_uring *ring); struct io_uring *ring);
extern void io_uring_queue_exit(struct io_uring *ring); extern void io_uring_queue_exit(struct io_uring *ring);
extern int io_uring_get_completion(struct io_uring *ring, extern int io_uring_get_completion(struct io_uring *ring,
struct io_uring_cqe **cqe_ptr); struct io_uring_cqe **cqe_ptr);

View File

@@ -13,14 +13,21 @@
#ifndef __NR_sys_io_uring_enter #ifndef __NR_sys_io_uring_enter
#define __NR_sys_io_uring_enter 336 #define __NR_sys_io_uring_enter 336
#endif #endif
#ifndef __NR_sys_io_uring_register
#define __NR_sys_io_uring_register 337
#endif
#else #else
#error "Arch not supported yet" #error "Arch not supported yet"
#endif #endif
int io_uring_setup(unsigned int entries, struct iovec *iovecs, int io_uring_register(int fd, unsigned int opcode, void *arg)
unsigned nr_iovecs, struct io_uring_params *p)
{ {
return syscall(__NR_sys_io_uring_setup, entries, iovecs, nr_iovecs, p); return syscall(__NR_sys_io_uring_register, fd, opcode, arg);
}
int io_uring_setup(unsigned int entries, struct io_uring_params *p)
{
return syscall(__NR_sys_io_uring_setup, entries, p);
} }
int io_uring_enter(int fd, unsigned int to_submit, unsigned int min_complete, int io_uring_enter(int fd, unsigned int to_submit, unsigned int min_complete,

View File

@@ -23,16 +23,14 @@ struct io_data {
struct iovec *iov; struct iovec *iov;
}; };
static int setup_context(unsigned entries, struct io_uring *ring, int offload) static int setup_context(unsigned entries, struct io_uring *ring)
{ {
struct io_uring_params p; struct io_uring_params p;
int ret; int ret;
memset(&p, 0, sizeof(p)); memset(&p, 0, sizeof(p));
if (offload)
p.flags = IORING_SETUP_SQWQ;
ret = io_uring_queue_init(entries, &p, NULL, 0, ring); ret = io_uring_queue_init(entries, &p, ring);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "queue_init: %s\n", strerror(-ret)); fprintf(stderr, "queue_init: %s\n", strerror(-ret));
return -1; return -1;
@@ -79,6 +77,7 @@ static int queue_read(int fd, off_t size, off_t offset)
sqe->fd = fd; sqe->fd = fd;
sqe->off = offset; sqe->off = offset;
sqe->addr = data->iov; sqe->addr = data->iov;
sqe->buf_index = 0;
sqe->data = (unsigned long) data; sqe->data = (unsigned long) data;
iovecs[sqe_index(sqe)].iov_len = size; iovecs[sqe_index(sqe)].iov_len = size;
sqe->len = 1; sqe->len = 1;
@@ -128,6 +127,7 @@ static void queue_write(int fd, struct io_uring_cqe *cqe)
sqe->fd = fd; sqe->fd = fd;
sqe->off = data->offset; sqe->off = data->offset;
sqe->addr = data->iov; sqe->addr = data->iov;
sqe->buf_index = 0;
sqe->data = 0; sqe->data = 0;
data->iov->iov_len = cqe->res; data->iov->iov_len = cqe->res;
sqe->len = 1; sqe->len = 1;
@@ -166,9 +166,9 @@ int main(int argc, char *argv[])
iovecs[i].iov_len = BS; iovecs[i].iov_len = BS;
} }
if (setup_context(QD, &in_ring, 1)) if (setup_context(QD, &in_ring))
return 1; return 1;
if (setup_context(QD, &out_ring, 0)) if (setup_context(QD, &out_ring))
return 1; return 1;
if (get_file_size(infd, &read_left)) if (get_file_size(infd, &read_left))
return 1; return 1;

View File

@@ -32,7 +32,7 @@ int main(int argc, char *argv[])
memset(&p, 0, sizeof(p)); memset(&p, 0, sizeof(p));
p.flags = IORING_SETUP_IOPOLL; p.flags = IORING_SETUP_IOPOLL;
ret = io_uring_queue_init(QD, &p, NULL, 0, &ring); ret = io_uring_queue_init(QD, &p, &ring);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "queue_init: %s\n", strerror(-ret)); fprintf(stderr, "queue_init: %s\n", strerror(-ret));
return 1; return 1;
@@ -65,6 +65,7 @@ int main(int argc, char *argv[])
sqe->off = offset; sqe->off = offset;
sqe->addr = &iovecs[i]; sqe->addr = &iovecs[i];
sqe->len = 1; sqe->len = 1;
sqe->buf_index = 0;
offset += iovecs[i].iov_len; offset += iovecs[i].iov_len;
} while (1); } while (1);