diff options
author | Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com> | 2020-11-12 14:56:00 +0800 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-12-09 12:04:00 -0700 |
commit | 906a3c6f9ca072e917c701f7421647e169740954 (patch) | |
tree | 9fd664240120e036fe64481088762648d9714a3b /fs | |
parent | a0d9205f7d36bf72279f34a93850fd14789fdc7e (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')
-rw-r--r-- | fs/io_uring.c | 18 |
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); } |