diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2022-12-02 20:47:23 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-12-14 18:53:04 +0300 |
commit | 6971253f078766543c716db708ba2c787826690d (patch) | |
tree | 39d199c16153315c53da8cd2198c7e067f1263d9 /io_uring/io_uring.c | |
parent | ea011ee10231f5fa6cbb415007048ca0bb948baf (diff) | |
download | linux-6971253f078766543c716db708ba2c787826690d.tar.xz |
io_uring: revise completion_lock locking
io_kill_timeouts() doesn't post any events but queues everything to
task_work. Locking there is needed for protecting linked requests
traversing, we should grab completion_lock directly instead of using
io_cq_[un]lock helpers. Same goes for __io_req_find_next_prep().
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/88e75d481a65dc295cb59722bb1cf76402d1c06b.1670002973.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/io_uring.c')
-rw-r--r-- | io_uring/io_uring.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index b521186efa5c..698c54f951ea 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -597,6 +597,18 @@ static inline void __io_cq_unlock(struct io_ring_ctx *ctx) spin_unlock(&ctx->completion_lock); } +static inline void io_cq_lock(struct io_ring_ctx *ctx) + __acquires(ctx->completion_lock) +{ + spin_lock(&ctx->completion_lock); +} + +static inline void io_cq_unlock(struct io_ring_ctx *ctx) + __releases(ctx->completion_lock) +{ + spin_unlock(&ctx->completion_lock); +} + /* keep it inlined for io_submit_flush_completions() */ static inline void __io_cq_unlock_post(struct io_ring_ctx *ctx) __releases(ctx->completion_lock) @@ -1074,9 +1086,9 @@ static void __io_req_find_next_prep(struct io_kiocb *req) { struct io_ring_ctx *ctx = req->ctx; - io_cq_lock(ctx); + spin_lock(&ctx->completion_lock); io_disarm_next(req); - io_cq_unlock_post(ctx); + spin_unlock(&ctx->completion_lock); } static inline struct io_kiocb *io_req_find_next(struct io_kiocb *req) |