From: Pavel Begunkov Date: Thu, 24 Jun 2021 14:09:55 +0000 (+0100) Subject: io_uring: don't change sqpoll creds if not needed X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=948e19479cb649587165243c6cc12d113c9cbbe0;p=uclinux-h8%2Flinux.git io_uring: don't change sqpoll creds if not needed 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 Link: https://lore.kernel.org/r/c54368da2357ac539e0a333f7cfff70d5fb045b2.1624543113.git.asml.silence@gmail.com Signed-off-by: Jens Axboe --- diff --git a/fs/io_uring.c b/fs/io_uring.c index e7997f9bf879..0cfbdee5da1a 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -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; }