io_uring: add a helper for apoll alloc
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 23 Jun 2022 13:24:46 +0000 (14:24 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jul 2022 00:39:16 +0000 (18:39 -0600)
Extract a helper function for apoll allocation, makes the code easier to
read.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/2f93282b47dd678e805dd0d7097f66968ced495c.1655990418.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/poll.c

index 7de8c52..aef77f2 100644 (file)
@@ -508,10 +508,33 @@ static void io_async_queue_proc(struct file *file, struct wait_queue_head *head,
        __io_queue_proc(&apoll->poll, pt, head, &apoll->double_poll);
 }
 
+static struct async_poll *io_req_alloc_apoll(struct io_kiocb *req,
+                                            unsigned issue_flags)
+{
+       struct io_ring_ctx *ctx = req->ctx;
+       struct async_poll *apoll;
+
+       if (req->flags & REQ_F_POLLED) {
+               apoll = req->apoll;
+               kfree(apoll->double_poll);
+       } else if (!(issue_flags & IO_URING_F_UNLOCKED) &&
+                  !list_empty(&ctx->apoll_cache)) {
+               apoll = list_first_entry(&ctx->apoll_cache, struct async_poll,
+                                               poll.wait.entry);
+               list_del_init(&apoll->poll.wait.entry);
+       } else {
+               apoll = kmalloc(sizeof(*apoll), GFP_ATOMIC);
+               if (unlikely(!apoll))
+                       return NULL;
+       }
+       apoll->double_poll = NULL;
+       req->apoll = apoll;
+       return apoll;
+}
+
 int io_arm_poll_handler(struct io_kiocb *req, unsigned issue_flags)
 {
        const struct io_op_def *def = &io_op_defs[req->opcode];
-       struct io_ring_ctx *ctx = req->ctx;
        struct async_poll *apoll;
        struct io_poll_table ipt;
        __poll_t mask = POLLPRI | POLLERR | EPOLLET;
@@ -546,21 +569,10 @@ int io_arm_poll_handler(struct io_kiocb *req, unsigned issue_flags)
        }
        if (def->poll_exclusive)
                mask |= EPOLLEXCLUSIVE;
-       if (req->flags & REQ_F_POLLED) {
-               apoll = req->apoll;
-               kfree(apoll->double_poll);
-       } else if (!(issue_flags & IO_URING_F_UNLOCKED) &&
-                  !list_empty(&ctx->apoll_cache)) {
-               apoll = list_first_entry(&ctx->apoll_cache, struct async_poll,
-                                               poll.wait.entry);
-               list_del_init(&apoll->poll.wait.entry);
-       } else {
-               apoll = kmalloc(sizeof(*apoll), GFP_ATOMIC);
-               if (unlikely(!apoll))
-                       return IO_APOLL_ABORTED;
-       }
-       apoll->double_poll = NULL;
-       req->apoll = apoll;
+
+       apoll = io_req_alloc_apoll(req, issue_flags);
+       if (!apoll)
+               return IO_APOLL_ABORTED;
        req->flags |= REQ_F_POLLED;
        ipt.pt._qproc = io_async_queue_proc;