2022-07-15 06:13:28

by John Ogness

[permalink] [raw]
Subject: [PATCH v3] printk: fix extra suspend/resume delays

As reported here [0], an unnecessary delay exists in the
suspend/resume paths for certain scenarios. Here is the
fix for it. Since the extra delays were introduced in
5.19-rc1, this fix should go into 5.19-rc7.

The changelog is in the patch stats.

John Ogness

[0] https://bugzilla.kernel.org/show_bug.cgi?id=216216

John Ogness (1):
printk: do not wait for consoles when suspended

kernel/printk/printk.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)


base-commit: 32346491ddf24599decca06190ebca03ff9de7f8
--
2.30.2


2022-07-15 06:13:29

by John Ogness

[permalink] [raw]
Subject: [PATCH v3] printk: do not wait for consoles when suspended

The console_stop() and console_start() functions call pr_flush().
When suspending, these functions are called by the serial subsystem
while the serial port is suspended. In this scenario, if there are
any pending messages, a call to pr_flush() will always result in a
timeout because the serial port cannot make forward progress. This
causes longer suspend and resume times.

Add a check in pr_flush() so that it will immediately timeout if
the consoles are suspended.

Fixes: 3b604ca81202 ("printk: add pr_flush()")
Reported-by: Todd Brandt <[email protected]>
Signed-off-by: John Ogness <[email protected]>
Tested-by: Todd Brandt <[email protected]>
---
v3: add more details to commit message and comment

v2: only avoid wait if suspended

kernel/printk/printk.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index b49c6ff6dca0..a1a81fd9889b 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -3380,6 +3380,7 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
diff = 0;

console_lock();
+
for_each_console(c) {
if (con && con != c)
continue;
@@ -3389,11 +3390,19 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
if (printk_seq < seq)
diff += seq - printk_seq;
}
- console_unlock();

- if (diff != last_diff && reset_on_progress)
+ /*
+ * If consoles are suspended, it cannot be expected that they
+ * make forward progress, so timeout immediately. @diff is
+ * still used to return a valid flush status.
+ */
+ if (console_suspended)
+ remaining = 0;
+ else if (diff != last_diff && reset_on_progress)
remaining = timeout_ms;

+ console_unlock();
+
if (diff == 0 || remaining == 0)
break;

--
2.30.2

2022-07-15 09:26:31

by Petr Mladek

[permalink] [raw]
Subject: Re: [PATCH v3] printk: do not wait for consoles when suspended

On Fri 2022-07-15 08:16:42, John Ogness wrote:
> The console_stop() and console_start() functions call pr_flush().
> When suspending, these functions are called by the serial subsystem
> while the serial port is suspended. In this scenario, if there are
> any pending messages, a call to pr_flush() will always result in a
> timeout because the serial port cannot make forward progress. This
> causes longer suspend and resume times.
>
> Add a check in pr_flush() so that it will immediately timeout if
> the consoles are suspended.
>
> Fixes: 3b604ca81202 ("printk: add pr_flush()")
> Reported-by: Todd Brandt <[email protected]>
> Signed-off-by: John Ogness <[email protected]>
> Tested-by: Todd Brandt <[email protected]>

The patch is committed in printk/linux.git, branch rework/kthreads.

I think about creating pull request for 5.19 later today or tomorrow
so that it is in the last rc.

Best Regards,
Petr