summaryrefslogtreecommitdiff
path: root/src/io_uring.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2019-01-08 15:31:35 -0700
committerJens Axboe <axboe@kernel.dk>2019-01-08 15:38:05 -0700
commit7f7a66e38543f36df6a64a4c3ba24ce4f4f04331 (patch)
tree92413056cbe4824e2a99e7a24073e9ad8a1d0d84 /src/io_uring.c
parentf47f24cea7d10abbc54e8dc8f184eca509dd77c1 (diff)
Change API to provide io_uring struct abstraction
This is cleaner than having the app juggle an SQ and CQ ring, just wrap them in struct io_uring and have the API always take that. This means the app doesn't need to worry about the different types of rings, and that we only need to pass in one argument for setup/teardown. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'src/io_uring.c')
-rw-r--r--src/io_uring.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/io_uring.c b/src/io_uring.c
index 21ce4f9..a9b6879 100644
--- a/src/io_uring.c
+++ b/src/io_uring.c
@@ -42,19 +42,19 @@ static int __io_uring_get_completion(int fd, struct io_uring_cq *cq,
/*
* Return an IO completion, if one is readily available
*/
-int io_uring_get_completion(int fd, struct io_uring_cq *cq,
+int io_uring_get_completion(int fd, struct io_uring *ring,
struct io_uring_event **ev_ptr)
{
- return __io_uring_get_completion(fd, cq, ev_ptr, 0);
+ return __io_uring_get_completion(fd, &ring->cq, ev_ptr, 0);
}
/*
* Return an IO completion, waiting for it if necessary
*/
-int io_uring_wait_completion(int fd, struct io_uring_cq *cq,
+int io_uring_wait_completion(int fd, struct io_uring *ring,
struct io_uring_event **ev_ptr)
{
- return __io_uring_get_completion(fd, cq, ev_ptr, 1);
+ return __io_uring_get_completion(fd, &ring->cq, ev_ptr, 1);
}
/*
@@ -62,8 +62,9 @@ int io_uring_wait_completion(int fd, struct io_uring_cq *cq,
*
* Returns number of iocbs submitted
*/
-int io_uring_submit(int fd, struct io_uring_sq *sq)
+int io_uring_submit(int fd, struct io_uring *ring)
{
+ struct io_uring_sq *sq = &ring->sq;
const unsigned mask = *sq->kring_mask;
unsigned ktail, ktail_next, submitted;
@@ -117,8 +118,9 @@ submit:
*
* Returns a vacant iocb, or NULL if we're full.
*/
-struct io_uring_iocb *io_uring_get_iocb(struct io_uring_sq *sq)
+struct io_uring_iocb *io_uring_get_iocb(struct io_uring *ring)
{
+ struct io_uring_sq *sq = &ring->sq;
unsigned next = sq->iocb_tail + 1;
struct io_uring_iocb *iocb;
@@ -186,8 +188,7 @@ err:
* contain the necessary information to read/write to the rings.
*/
int io_uring_queue_init(unsigned entries, struct io_uring_params *p,
- struct iovec *iovecs, struct io_uring_sq *sq,
- struct io_uring_cq *cq)
+ struct iovec *iovecs, struct io_uring *ring)
{
int fd;
@@ -195,13 +196,15 @@ int io_uring_queue_init(unsigned entries, struct io_uring_params *p,
if (fd < 0)
return fd;
- memset(sq, 0, sizeof(*sq));
- memset(cq, 0, sizeof(*cq));
- return io_uring_mmap(fd, p, sq, cq);
+ memset(ring, 0, sizeof(*ring));
+ return io_uring_mmap(fd, p, &ring->sq, &ring->cq);
}
-void io_uring_queue_exit(int fd, struct io_uring_sq *sq, struct io_uring_cq *cq)
+void io_uring_queue_exit(int fd, struct io_uring *ring)
{
+ struct io_uring_sq *sq = &ring->sq;
+ struct io_uring_cq *cq = &ring->cq;
+
munmap(sq->iocbs, *sq->kring_entries * sizeof(struct io_uring_iocb));
munmap(sq->khead, sq->ring_sz);
munmap(cq->khead, cq->ring_sz);