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

John Ogness posted 1 patch 3 years, 9 months ago
kernel/printk/printk.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
[PATCH v3] printk: do not wait for consoles when suspended
Posted by John Ogness 3 years, 9 months ago
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 <todd.e.brandt@linux.intel.com>
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com>
---
 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
Re: [PATCH v3] printk: do not wait for consoles when suspended
Posted by Petr Mladek 3 years, 9 months ago
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 <todd.e.brandt@linux.intel.com>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
> Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com>

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