Skip to content

Commit

Permalink
io_uring: add completion locking for iopoll
Browse files Browse the repository at this point in the history
commit 2ccc92f upstream.

There are pieces of code that may allow iopoll to race filling cqes,
temporarily add spinlocking around posting events.

Cc: stable@vger.kernel.org
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/84d86b5c117feda075471c5c9e65208e0dccf5d0.1669203009.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
isilence authored and gregkh committed Dec 31, 2022
1 parent 3a6ee45 commit 16225ab
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions io_uring/rw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1043,6 +1043,7 @@ int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)
else if (!pos)
return 0;

spin_lock(&ctx->completion_lock);
prev = start;
wq_list_for_each_resume(pos, prev) {
struct io_kiocb *req = container_of(pos, struct io_kiocb, comp_list);
Expand All @@ -1057,11 +1058,11 @@ int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)
req->cqe.flags = io_put_kbuf(req, 0);
__io_fill_cqe_req(req->ctx, req);
}

io_commit_cqring(ctx);
spin_unlock(&ctx->completion_lock);
if (unlikely(!nr_events))
return 0;

io_commit_cqring(ctx);
io_cqring_ev_posted_iopoll(ctx);
pos = start ? start->next : ctx->iopoll_list.first;
wq_list_cut(&ctx->iopoll_list, prev, start);
Expand Down

0 comments on commit 16225ab

Please sign in to comment.