Skip to content

Commit 5e3afe5

Browse files
isilenceaxboe
authored andcommitted
io_uring: fix poll_remove stalled req completion
Taking the ctx lock is not enough to use the deferred request completion infrastructure, it'll get queued into the list but no one would expect it there, so it will sit there until next io_submit_flush_completions(). It's hard to care about the cancellation path, so complete it via tw. Fixes: ef7dfac ("io_uring/poll: serialize poll linked timer start with poll removal") Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/c446740bc16858f8a2a8dcdce899812f21d15f23.1710514702.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 67d1189 commit 5e3afe5

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

io_uring/poll.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,6 @@ int io_poll_remove(struct io_kiocb *req, unsigned int issue_flags)
996996
struct io_hash_bucket *bucket;
997997
struct io_kiocb *preq;
998998
int ret2, ret = 0;
999-
struct io_tw_state ts = { .locked = true };
1000999

10011000
io_ring_submit_lock(ctx, issue_flags);
10021001
preq = io_poll_find(ctx, true, &cd, &ctx->cancel_table, &bucket);
@@ -1045,7 +1044,8 @@ int io_poll_remove(struct io_kiocb *req, unsigned int issue_flags)
10451044

10461045
req_set_fail(preq);
10471046
io_req_set_res(preq, -ECANCELED, 0);
1048-
io_req_task_complete(preq, &ts);
1047+
preq->io_task_work.func = io_req_task_complete;
1048+
io_req_task_work_add(preq);
10491049
out:
10501050
io_ring_submit_unlock(ctx, issue_flags);
10511051
if (ret < 0) {

0 commit comments

Comments
 (0)