io_uring: don't acquire uring_lock twice
authorXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Thu, 12 Nov 2020 06:56:00 +0000 (14:56 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Dec 2020 19:04:00 +0000 (12:04 -0700)
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>
fs/io_uring.c

index d52d6f5..67bf904 100644 (file)
@@ -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);
        }