io_uring: don't change sqpoll creds if not needed
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 24 Jun 2021 14:09:55 +0000 (15:09 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 30 Jun 2021 20:15:38 +0000 (14:15 -0600)
SQPOLL doesn't need to change creds if it's not submitting requests.
Move creds overriding into __io_sq_thread() after checking if there are
SQEs pending.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/c54368da2357ac539e0a333f7cfff70d5fb045b2.1624543113.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index e7997f9..0cfbdee 100644 (file)
@@ -6803,6 +6803,10 @@ static int __io_sq_thread(struct io_ring_ctx *ctx, bool cap_entries)
 
        if (!list_empty(&ctx->iopoll_list) || to_submit) {
                unsigned nr_events = 0;
+               const struct cred *creds = NULL;
+
+               if (ctx->sq_creds != current_cred())
+                       creds = override_creds(ctx->sq_creds);
 
                mutex_lock(&ctx->uring_lock);
                if (!list_empty(&ctx->iopoll_list))
@@ -6819,6 +6823,8 @@ static int __io_sq_thread(struct io_ring_ctx *ctx, bool cap_entries)
 
                if (to_submit && wq_has_sleeper(&ctx->sqo_sq_wait))
                        wake_up(&ctx->sqo_sq_wait);
+               if (creds)
+                       revert_creds(creds);
        }
 
        return ret;
@@ -6870,7 +6876,6 @@ static int io_sq_thread(void *data)
 
        mutex_lock(&sqd->lock);
        while (1) {
-               int ret;
                bool cap_entries, sqt_spin, needs_sched;
 
                if (io_sqd_events_pending(sqd) || signal_pending(current)) {
@@ -6883,13 +6888,8 @@ static int io_sq_thread(void *data)
                sqt_spin = false;
                cap_entries = !list_is_singular(&sqd->ctx_list);
                list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
-                       const struct cred *creds = NULL;
+                       int ret = __io_sq_thread(ctx, cap_entries);
 
-                       if (ctx->sq_creds != current_cred())
-                               creds = override_creds(ctx->sq_creds);
-                       ret = __io_sq_thread(ctx, cap_entries);
-                       if (creds)
-                               revert_creds(creds);
                        if (!sqt_spin && (ret > 0 || !list_empty(&ctx->iopoll_list)))
                                sqt_spin = true;
                }