at v5.1-rc2 3.6 kB view raw
1#ifndef LIB_URING_H 2#define LIB_URING_H 3 4#include <sys/uio.h> 5#include <signal.h> 6#include <string.h> 7#include "../../include/uapi/linux/io_uring.h" 8 9/* 10 * Library interface to io_uring 11 */ 12struct io_uring_sq { 13 unsigned *khead; 14 unsigned *ktail; 15 unsigned *kring_mask; 16 unsigned *kring_entries; 17 unsigned *kflags; 18 unsigned *kdropped; 19 unsigned *array; 20 struct io_uring_sqe *sqes; 21 22 unsigned sqe_head; 23 unsigned sqe_tail; 24 25 size_t ring_sz; 26}; 27 28struct io_uring_cq { 29 unsigned *khead; 30 unsigned *ktail; 31 unsigned *kring_mask; 32 unsigned *kring_entries; 33 unsigned *koverflow; 34 struct io_uring_cqe *cqes; 35 36 size_t ring_sz; 37}; 38 39struct io_uring { 40 struct io_uring_sq sq; 41 struct io_uring_cq cq; 42 int ring_fd; 43}; 44 45/* 46 * System calls 47 */ 48extern int io_uring_setup(unsigned entries, struct io_uring_params *p); 49extern int io_uring_enter(unsigned fd, unsigned to_submit, 50 unsigned min_complete, unsigned flags, sigset_t *sig); 51extern int io_uring_register(int fd, unsigned int opcode, void *arg, 52 unsigned int nr_args); 53 54/* 55 * Library interface 56 */ 57extern int io_uring_queue_init(unsigned entries, struct io_uring *ring, 58 unsigned flags); 59extern int io_uring_queue_mmap(int fd, struct io_uring_params *p, 60 struct io_uring *ring); 61extern void io_uring_queue_exit(struct io_uring *ring); 62extern int io_uring_get_completion(struct io_uring *ring, 63 struct io_uring_cqe **cqe_ptr); 64extern int io_uring_wait_completion(struct io_uring *ring, 65 struct io_uring_cqe **cqe_ptr); 66extern int io_uring_submit(struct io_uring *ring); 67extern struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring); 68 69/* 70 * Command prep helpers 71 */ 72static inline void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data) 73{ 74 sqe->user_data = (unsigned long) data; 75} 76 77static inline void io_uring_prep_rw(int op, struct io_uring_sqe *sqe, int fd, 78 void *addr, unsigned len, off_t offset) 79{ 80 memset(sqe, 0, sizeof(*sqe)); 81 sqe->opcode = op; 82 sqe->fd = fd; 83 sqe->off = offset; 84 sqe->addr = (unsigned long) addr; 85 sqe->len = len; 86} 87 88static inline void io_uring_prep_readv(struct io_uring_sqe *sqe, int fd, 89 struct iovec *iovecs, unsigned nr_vecs, 90 off_t offset) 91{ 92 io_uring_prep_rw(IORING_OP_READV, sqe, fd, iovecs, nr_vecs, offset); 93} 94 95static inline void io_uring_prep_read_fixed(struct io_uring_sqe *sqe, int fd, 96 void *buf, unsigned nbytes, 97 off_t offset) 98{ 99 io_uring_prep_rw(IORING_OP_READ_FIXED, sqe, fd, buf, nbytes, offset); 100} 101 102static inline void io_uring_prep_writev(struct io_uring_sqe *sqe, int fd, 103 struct iovec *iovecs, unsigned nr_vecs, 104 off_t offset) 105{ 106 io_uring_prep_rw(IORING_OP_WRITEV, sqe, fd, iovecs, nr_vecs, offset); 107} 108 109static inline void io_uring_prep_write_fixed(struct io_uring_sqe *sqe, int fd, 110 void *buf, unsigned nbytes, 111 off_t offset) 112{ 113 io_uring_prep_rw(IORING_OP_WRITE_FIXED, sqe, fd, buf, nbytes, offset); 114} 115 116static inline void io_uring_prep_poll_add(struct io_uring_sqe *sqe, int fd, 117 short poll_mask) 118{ 119 memset(sqe, 0, sizeof(*sqe)); 120 sqe->opcode = IORING_OP_POLL_ADD; 121 sqe->fd = fd; 122 sqe->poll_events = poll_mask; 123} 124 125static inline void io_uring_prep_poll_remove(struct io_uring_sqe *sqe, 126 void *user_data) 127{ 128 memset(sqe, 0, sizeof(*sqe)); 129 sqe->opcode = IORING_OP_POLL_REMOVE; 130 sqe->addr = (unsigned long) user_data; 131} 132 133static inline void io_uring_prep_fsync(struct io_uring_sqe *sqe, int fd, 134 int datasync) 135{ 136 memset(sqe, 0, sizeof(*sqe)); 137 sqe->opcode = IORING_OP_FSYNC; 138 sqe->fd = fd; 139 if (datasync) 140 sqe->fsync_flags = IORING_FSYNC_DATASYNC; 141} 142 143#endif