diff options
author | Jeff Moyer <jmoyer@redhat.com> | 2019-02-08 14:54:02 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-02-08 12:56:35 -0700 |
commit | 996b5a65a58cfd3334fcc6c268911126ced35d61 (patch) | |
tree | 641894f8f901dd72c549131a75b2ba609953c4df | |
parent | bd7ad347f9dbe8ca9474404d06913417fea549f1 (diff) |
add io_uring_queue_mmap
io_uring_queue_init does not allow the caller to specify sq_thread_cpu
or sq_thread_idle. Users that want to specify those parameters need to
call io_uring_setup(2) themselves. Add a helper so that they don't also
have to hand-craft the code to map the submission and completion queues,
and setup the sqe ring. This allows those applications to still make
use of io_uring_submit and get/wait_completion.
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | src/liburing.h | 2 | ||||
-rw-r--r-- | src/setup.c | 25 |
2 files changed, 21 insertions, 6 deletions
diff --git a/src/liburing.h b/src/liburing.h index 623556a..2e7303c 100644 --- a/src/liburing.h +++ b/src/liburing.h @@ -56,6 +56,8 @@ extern int io_uring_register(int fd, unsigned int opcode, void *arg, */ extern int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags); +extern int io_uring_queue_mmap(int fd, struct io_uring_params *p, + struct io_uring *ring); extern void io_uring_queue_exit(struct io_uring *ring); extern int io_uring_get_completion(struct io_uring *ring, struct io_uring_cqe **cqe_ptr); diff --git a/src/setup.c b/src/setup.c index eeb5fef..9979dd0 100644 --- a/src/setup.c +++ b/src/setup.c @@ -58,13 +58,30 @@ err: } /* + * For users that want to specify sq_thread_cpu or sq_thread_idle, this + * interface is a convenient helper for mmap()ing the rings. + * Returns -1 on error, or zero on success. On success, 'ring' + * contains the necessary information to read/write to the rings. + */ +int io_uring_queue_mmap(int fd, struct io_uring_params *p, struct io_uring *ring) +{ + int ret; + + memset(ring, 0, sizeof(*ring)); + ret = io_uring_mmap(fd, p, &ring->sq, &ring->cq); + if (!ret) + ring->ring_fd = fd; + return ret; +} + +/* * Returns -1 on error, or zero on success. On success, 'ring' * contains the necessary information to read/write to the rings. */ int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags) { struct io_uring_params p; - int fd, ret; + int fd; memset(&p, 0, sizeof(p)); p.flags = flags; @@ -73,11 +90,7 @@ int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags) if (fd < 0) return fd; - memset(ring, 0, sizeof(*ring)); - ret = io_uring_mmap(fd, &p, &ring->sq, &ring->cq); - if (!ret) - ring->ring_fd = fd; - return ret; + return io_uring_queue_mmap(fd, &p, ring); } void io_uring_queue_exit(struct io_uring *ring) |