summaryrefslogtreecommitdiff
path: root/fs/io_uring.c
diff options
context:
space:
mode:
authorXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>2020-11-12 14:56:00 +0800
committerJens Axboe <axboe@kernel.dk>2020-12-09 12:04:00 -0700
commit906a3c6f9ca072e917c701f7421647e169740954 (patch)
tree9fd664240120e036fe64481088762648d9714a3b /fs/io_uring.c
parenta0d9205f7d36bf72279f34a93850fd14789fdc7e (diff)
io_uring: don't acquire uring_lock twice
Both IOPOLL and sqes handling need to acquire uring_lock, combine them together, then we just need to acquire uring_lock once. Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r--fs/io_uring.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index d52d6f529dc6..67bf9047d230 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -6847,23 +6847,19 @@ static int __io_sq_thread(struct io_ring_ctx *ctx, bool cap_entries)
unsigned int to_submit;
int ret = 0;
- if (!list_empty(&ctx->iopoll_list)) {
- unsigned nr_events = 0;
-
- mutex_lock(&ctx->uring_lock);
- if (!list_empty(&ctx->iopoll_list))
- io_do_iopoll(ctx, &nr_events, 0);
- mutex_unlock(&ctx->uring_lock);
- }
-
to_submit = io_sqring_entries(ctx);
/* if we're handling multiple rings, cap submit size for fairness */
if (cap_entries && to_submit > 8)
to_submit = 8;
- if (to_submit) {
+ if (!list_empty(&ctx->iopoll_list) || to_submit) {
+ unsigned nr_events = 0;
+
mutex_lock(&ctx->uring_lock);
- if (likely(!percpu_ref_is_dying(&ctx->refs)))
+ if (!list_empty(&ctx->iopoll_list))
+ io_do_iopoll(ctx, &nr_events, 0);
+
+ if (to_submit && likely(!percpu_ref_is_dying(&ctx->refs)))
ret = io_submit_sqes(ctx, to_submit);
mutex_unlock(&ctx->uring_lock);
}