mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 15:19:51 +00:00
io_uring: ensure workqueue offload grabs ring mutex for poll list
A previous commit moved the locking for the async sqthread, but didn't take into account that the io-wq workers still need it. We can't use req->in_async for this anymore as both the sqthread and io-wq workers set it, gate the need for locking on io_wq_current_is_worker() instead. Fixes: 8a4955ff1cca ("io_uring: sqthread should grab ctx->uring_lock for submissions") Reported-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
797f3f535d
commit
11ba820bf1
@ -3286,10 +3286,19 @@ static int io_issue_sqe(struct io_kiocb *req, const struct io_uring_sqe *sqe,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (ctx->flags & IORING_SETUP_IOPOLL) {
|
if (ctx->flags & IORING_SETUP_IOPOLL) {
|
||||||
|
const bool in_async = io_wq_current_is_worker();
|
||||||
|
|
||||||
if (req->result == -EAGAIN)
|
if (req->result == -EAGAIN)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
|
/* workqueue context doesn't hold uring_lock, grab it now */
|
||||||
|
if (in_async)
|
||||||
|
mutex_lock(&ctx->uring_lock);
|
||||||
|
|
||||||
io_iopoll_req_issued(req);
|
io_iopoll_req_issued(req);
|
||||||
|
|
||||||
|
if (in_async)
|
||||||
|
mutex_unlock(&ctx->uring_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user