Do not use `mmap()` and `mumap()` directly from the libc in the liburing internal sources. Wrap them in `src/syscall.c`. This is the part of implementing the kernel style return value (which later is supposed to support no libc environment). `liburing_mmap()` and `liburing_munmap()` do the same thing with `mmap()` and `munmap()` from the libc. The only different is when error happens, the return value is of `liburing_{mmap,munmap}()` will be a negative error code. Signed-off-by: Ammar Faizi <ammar.faizi@xxxxxxxxxxxxxxxxxxxxx> --- src/setup.c | 37 +++++++++++++++++++++---------------- src/syscall.c | 23 +++++++++++++++++++++++ src/syscall.h | 5 +++++ 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/setup.c b/src/setup.c index edfe94e..01cb151 100644 --- a/src/setup.c +++ b/src/setup.c @@ -15,12 +15,13 @@ #include "liburing.h" #include "syscall.h" +#include "kernel_err.h" static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq) { - munmap(sq->ring_ptr, sq->ring_sz); + liburing_munmap(sq->ring_ptr, sq->ring_sz); if (cq->ring_ptr && cq->ring_ptr != sq->ring_ptr) - munmap(cq->ring_ptr, cq->ring_sz); + liburing_munmap(cq->ring_ptr, cq->ring_sz); } static int io_uring_mmap(int fd, struct io_uring_params *p, @@ -37,19 +38,22 @@ static int io_uring_mmap(int fd, struct io_uring_params *p, sq->ring_sz = cq->ring_sz; cq->ring_sz = sq->ring_sz; } - sq->ring_ptr = mmap(0, sq->ring_sz, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_SQ_RING); - if (sq->ring_ptr == MAP_FAILED) - return -errno; + sq->ring_ptr = liburing_mmap(0, sq->ring_sz, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, + IORING_OFF_SQ_RING); + if (IS_ERR(sq->ring_ptr)) + return PTR_ERR(sq->ring_ptr); if (p->features & IORING_FEAT_SINGLE_MMAP) { cq->ring_ptr = sq->ring_ptr; } else { - cq->ring_ptr = mmap(0, cq->ring_sz, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, fd, IORING_OFF_CQ_RING); - if (cq->ring_ptr == MAP_FAILED) { + cq->ring_ptr = liburing_mmap(0, cq->ring_sz, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, + IORING_OFF_CQ_RING); + if (IS_ERR(cq->ring_ptr)) { + ret = PTR_ERR(cq->ring_ptr); cq->ring_ptr = NULL; - ret = -errno; goto err; } } @@ -63,11 +67,11 @@ static int io_uring_mmap(int fd, struct io_uring_params *p, sq->array = sq->ring_ptr + p->sq_off.array; size = p->sq_entries * sizeof(struct io_uring_sqe); - sq->sqes = mmap(0, size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_POPULATE, fd, - IORING_OFF_SQES); - if (sq->sqes == MAP_FAILED) { - ret = -errno; + sq->sqes = liburing_mmap(0, size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, fd, + IORING_OFF_SQES); + if (IS_ERR(sq->sqes)) { + ret = PTR_ERR(sq->sqes); err: io_uring_unmap_rings(sq, cq); return ret; @@ -173,7 +177,8 @@ void io_uring_queue_exit(struct io_uring *ring) struct io_uring_sq *sq = &ring->sq; struct io_uring_cq *cq = &ring->cq; - munmap(sq->sqes, *sq->kring_entries * sizeof(struct io_uring_sqe)); + liburing_munmap(sq->sqes, + *sq->kring_entries * sizeof(struct io_uring_sqe)); io_uring_unmap_rings(sq, cq); close(ring->ring_fd); } diff --git a/src/syscall.c b/src/syscall.c index 0ecc17b..cb48a94 100644 --- a/src/syscall.c +++ b/src/syscall.c @@ -8,9 +8,12 @@ #include <unistd.h> #include <sys/syscall.h> #include <sys/uio.h> +#include <sys/mman.h> + #include "liburing/compat.h" #include "liburing/io_uring.h" #include "syscall.h" +#include "kernel_err.h" #ifdef __alpha__ /* @@ -110,3 +113,23 @@ int ____sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete, return ____sys_io_uring_enter2(fd, to_submit, min_complete, flags, sig, _NSIG / 8); } + +void *liburing_mmap(void *addr, size_t length, int prot, int flags, int fd, + off_t offset) +{ + void *ret; + + ret = mmap(addr, length, prot, flags, fd, offset); + if (ret == MAP_FAILED) + ret = ERR_PTR(-errno); + + return ret; +} + +int liburing_munmap(void *addr, size_t length) +{ + int ret; + + ret = munmap(addr, length); + return (ret < 0) ? -errno : ret; +} diff --git a/src/syscall.h b/src/syscall.h index 8cd2d4c..feccf67 100644 --- a/src/syscall.h +++ b/src/syscall.h @@ -3,6 +3,7 @@ #define LIBURING_SYSCALL_H #include <signal.h> +#include "kernel_err.h" struct io_uring_params; @@ -25,4 +26,8 @@ int ____sys_io_uring_enter2(int fd, unsigned to_submit, unsigned min_complete, int ____sys_io_uring_register(int fd, unsigned int opcode, const void *arg, unsigned int nr_args); +void *liburing_mmap(void *addr, size_t length, int prot, int flags, int fd, + off_t offset); +int liburing_munmap(void *addr, size_t length); + #endif -- 2.30.2