]> asedeno.scripts.mit.edu Git - linux.git/blob - tools/io_uring/liburing.h
Merge remote-tracking branch 'net/master'
[linux.git] / tools / io_uring / liburing.h
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  */
12 struct 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
28 struct 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
39 struct 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  */
48 extern int io_uring_setup(unsigned entries, struct io_uring_params *p);
49 extern int io_uring_enter(unsigned fd, unsigned to_submit,
50         unsigned min_complete, unsigned flags, sigset_t *sig);
51 extern int io_uring_register(int fd, unsigned int opcode, void *arg,
52         unsigned int nr_args);
53
54 /*
55  * Library interface
56  */
57 extern int io_uring_queue_init(unsigned entries, struct io_uring *ring,
58         unsigned flags);
59 extern int io_uring_queue_mmap(int fd, struct io_uring_params *p,
60         struct io_uring *ring);
61 extern void io_uring_queue_exit(struct io_uring *ring);
62 extern int io_uring_get_completion(struct io_uring *ring,
63         struct io_uring_cqe **cqe_ptr);
64 extern int io_uring_wait_completion(struct io_uring *ring,
65         struct io_uring_cqe **cqe_ptr);
66 extern int io_uring_submit(struct io_uring *ring);
67 extern struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring);
68
69 /*
70  * Command prep helpers
71  */
72 static inline void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data)
73 {
74         sqe->user_data = (unsigned long) data;
75 }
76
77 static 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
88 static 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
95 static 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
102 static 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
109 static 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
116 static 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
125 static 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
133 static 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