Setup and tear down¶
This section describes functions that help you setup and tear down io_uring usage in your programs.
-
struct
io_uring¶
struct io_uring {
struct io_uring_sq sq;
struct io_uring_cq cq;
unsigned flags;
int ring_fd;
};
TODO: Are the below two structs really required? Remove them if they are only used internally.
-
struct
io_uring_sq¶
struct io_uring_sq {
unsigned *khead;
unsigned *ktail;
unsigned *kring_mask;
unsigned *kring_entries;
unsigned *kflags;
unsigned *kdropped;
unsigned *array;
struct io_uring_sqe *sqes;
unsigned sqe_head;
unsigned sqe_tail;
size_t ring_sz;
void *ring_ptr;
};
-
struct
io_uring_cq¶
struct io_uring_cq {
unsigned *khead;
unsigned *ktail;
unsigned *kring_mask;
unsigned *kring_entries;
unsigned *koverflow;
struct io_uring_cqe *cqes;
size_t ring_sz;
void *ring_ptr;
};
-
int
io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags)¶ Initializes
io_uringfor use in your programs. You’d want to call this function before you get to do anything else withio_uring.Parameters
entries: the number of entries you want to request for the submission queue. Each request holds details about one I/O operation.
ring: pointer to
io_uringstructure which will be filled up by the kernel.flags: flags you want to pass. See io_uring_setup for details.
Return value: returns 0 on success and
-erronoon failure. You can use strerror(3) to get a human readable version of the reason for failure.See also
-
int
io_uring_queue_init_params(unsigned entries, struct io_uring *ring, struct io_uring_params *p)¶ Functionally equivalent to
io_uring_queue_init(), but additionally takes a pointer toio_uring_paramsstructure, allowing you to specify your ownio_uring_paramsstructure.In the
io_uring_paramsstructure, you can only specifyflagswhich can be used to set various flags andsq_thread_cpuandsq_thread_idlefields, which are used to set the CPU affinity and submit queue idle time. Other fields of the structure are filled up by the kernel on return. When you useio_uring_queue_init(), you don’t get to specify these values. This function’s existence solves this problem for you.TODO: example program would help here.
-
int
io_uring_queue_mmap(int fd, struct io_uring_params *p, struct io_uring *ring)¶ This is a low-level function you’ll only want to use when you want to control a lot of aspects of the
io_uringinitialization. Before calling this function, you should have already called the low-levelio_uring_setup(). You can then use this function to mmap(2) the rings for you.Parameters
fd: the file descriptor returned by
io_uring_setup()p: a pointer to
io_uring_paramsring: a pointer to
io_uring
-
int
io_uring_ring_dontfork(struct io_uring *ring)¶ Use this call if you do not want child processes of your process inheriting the ring mappings.
Parameters
ring:
io_uringstructure as setup byio_uring_queue_init().
Return value: returns 0 on success and
-erronoon failure. You can use strerror(3) to get a human readable version of the reason for failure.See also
madvice(2), especially
MADV_DONTFORK.
-
void
io_uring_queue_exit(struct io_uring *ring)¶ Tear down function for
io_uring. Unmaps all setup shared ring buffers and closes the low-levelio_uringfile descriptor returned by the kernel.Parameters
ring:
io_uringstructure as setup byio_uring_queue_init().