]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
io_uring: always lock in io_apoll_task_func
authorDylan Yudaken <dylany@meta.com>
Thu, 24 Nov 2022 09:35:52 +0000 (01:35 -0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 25 Nov 2022 13:10:04 +0000 (06:10 -0700)
This is required for the failure case (io_req_complete_failed) and is
missing.

The alternative would be to only lock in the failure path, however all of
the non-error paths in io_poll_check_events that do not do not return
IOU_POLL_NO_ACTION end up locking anyway. The only extraneous lock would
be for the multishot poll overflowing the CQE ring, however multishot poll
would probably benefit from being locked as it will allow completions to
be batched.

So it seems reasonable to lock always.

Signed-off-by: Dylan Yudaken <dylany@meta.com>
Link: https://lore.kernel.org/r/20221124093559.3780686-3-dylany@meta.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/poll.c

index 4624e5eba63e3a332ac9fd30b61101aff638dd29..42aa10b50f6cfcfe7415a9f0c3f0bbfaf9aa80d5 100644 (file)
@@ -308,11 +308,12 @@ static void io_apoll_task_func(struct io_kiocb *req, bool *locked)
        if (ret == IOU_POLL_NO_ACTION)
                return;
 
+       io_tw_lock(req->ctx, locked);
        io_poll_remove_entries(req);
        io_poll_tw_hash_eject(req, locked);
 
        if (ret == IOU_POLL_REMOVE_POLL_USE_RES)
-               io_req_complete_post_tw(req, locked);
+               io_req_task_complete(req, locked);
        else if (ret == IOU_POLL_DONE)
                io_req_task_submit(req, locked);
        else