From f0517b45d68a9fcc873e2e6cd056394565c5d1c7 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 4 Aug 2023 12:27:25 +0200 Subject: [PATCH] 5.15-stable patches added patches: io_uring-gate-iowait-schedule-on-having-pending-requests.patch --- ...-schedule-on-having-pending-requests.patch | 81 +++++++++++++++++++ queue-5.15/series | 1 + 2 files changed, 82 insertions(+) create mode 100644 queue-5.15/io_uring-gate-iowait-schedule-on-having-pending-requests.patch diff --git a/queue-5.15/io_uring-gate-iowait-schedule-on-having-pending-requests.patch b/queue-5.15/io_uring-gate-iowait-schedule-on-having-pending-requests.patch new file mode 100644 index 00000000000..31f9c1630fa --- /dev/null +++ b/queue-5.15/io_uring-gate-iowait-schedule-on-having-pending-requests.patch @@ -0,0 +1,81 @@ +From bca63954fe0022a9c0dc06b94f68271c956875b2 Mon Sep 17 00:00:00 2001 +From: Jens Axboe +Date: Tue, 1 Aug 2023 08:39:47 -0600 +Subject: io_uring: gate iowait schedule on having pending requests + +From: Jens Axboe + +Commit 7b72d661f1f2f950ab8c12de7e2bc48bdac8ed69 upstream. + +A previous commit made all cqring waits marked as iowait, as a way to +improve performance for short schedules with pending IO. However, for +use cases that have a special reaper thread that does nothing but +wait on events on the ring, this causes a cosmetic issue where we +know have one core marked as being "busy" with 100% iowait. + +While this isn't a grave issue, it is confusing to users. Rather than +always mark us as being in iowait, gate setting of current->in_iowait +to 1 by whether or not the waiting task has pending requests. + +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/io-uring/CAMEGJJ2RxopfNQ7GNLhr7X9=bHXKo+G5OOe0LUq=+UgLXsv1Xg@mail.gmail.com/ +Link: https://bugzilla.kernel.org/show_bug.cgi?id=217699 +Link: https://bugzilla.kernel.org/show_bug.cgi?id=217700 +Reported-by: Oleksandr Natalenko +Reported-by: Phil Elwell +Tested-by: Andres Freund +Fixes: 8a796565cec3 ("io_uring: Use io_schedule* in cqring wait") +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + io_uring/io_uring.c | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +--- a/io_uring/io_uring.c ++++ b/io_uring/io_uring.c +@@ -7802,12 +7802,21 @@ static int io_run_task_work_sig(void) + return -EINTR; + } + ++static bool current_pending_io(void) ++{ ++ struct io_uring_task *tctx = current->io_uring; ++ ++ if (!tctx) ++ return false; ++ return percpu_counter_read_positive(&tctx->inflight); ++} ++ + /* when returns >0, the caller should retry */ + static inline int io_cqring_wait_schedule(struct io_ring_ctx *ctx, + struct io_wait_queue *iowq, + ktime_t *timeout) + { +- int token, ret; ++ int io_wait, ret; + + /* make sure we run task_work before checking for signals */ + ret = io_run_task_work_sig(); +@@ -7818,15 +7827,17 @@ static inline int io_cqring_wait_schedul + return 1; + + /* +- * Use io_schedule_prepare/finish, so cpufreq can take into account +- * that the task is waiting for IO - turns out to be important for low +- * QD IO. ++ * Mark us as being in io_wait if we have pending requests, so cpufreq ++ * can take into account that the task is waiting for IO - turns out ++ * to be important for low QD IO. + */ +- token = io_schedule_prepare(); ++ io_wait = current->in_iowait; ++ if (current_pending_io()) ++ current->in_iowait = 1; + ret = 1; + if (!schedule_hrtimeout(timeout, HRTIMER_MODE_ABS)) + ret = -ETIME; +- io_schedule_finish(token); ++ current->in_iowait = io_wait; + return ret; + } + diff --git a/queue-5.15/series b/queue-5.15/series index e69de29bb2d..933a41e543c 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -0,0 +1 @@ +io_uring-gate-iowait-schedule-on-having-pending-requests.patch -- 2.47.3