Skip to content

Commit

Permalink
io_uring/waitid: always remove waitid entry for cancel all
Browse files Browse the repository at this point in the history
[ Upstream commit 2b35b8b ]

We know the request is either being removed, or already in the process of
being removed through task_work, so we can delete it from our waitid list
upfront. This is important for remove all conditions, as we otherwise
will find it multiple times and prevent cancelation progress.

Remove the dead check in cancelation as well for the hash_node being
empty or not. We already have a waitid reference check for ownership,
so we don't need to check the list too.

Cc: stable@vger.kernel.org
Fixes: f31ecf6 ("io_uring: add IORING_OP_WAITID support")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
axboe authored and gregkh committed Apr 3, 2024
1 parent 4cb7946 commit b2f998f
Showing 1 changed file with 1 addition and 6 deletions.
7 changes: 1 addition & 6 deletions io_uring/waitid.c
Expand Up @@ -125,12 +125,6 @@ static void io_waitid_complete(struct io_kiocb *req, int ret)

lockdep_assert_held(&req->ctx->uring_lock);

/*
* Did cancel find it meanwhile?
*/
if (hlist_unhashed(&req->hash_node))
return;

hlist_del_init(&req->hash_node);

ret = io_waitid_finish(req, ret);
Expand Down Expand Up @@ -202,6 +196,7 @@ bool io_waitid_remove_all(struct io_ring_ctx *ctx, struct task_struct *task,
hlist_for_each_entry_safe(req, tmp, &ctx->waitid_list, hash_node) {
if (!io_match_task_safe(req, task, cancel_all))
continue;
hlist_del_init(&req->hash_node);
__io_waitid_cancel(ctx, req);
found = true;
}
Expand Down

0 comments on commit b2f998f

Please sign in to comment.