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: 3b604ca812
("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>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20220715061042.373640-2-john.ogness@linutronix.de
This commit is contained in:
Родитель
07a22b6194
Коммит
9023ca0866
|
@ -3380,6 +3380,7 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
|
||||||
diff = 0;
|
diff = 0;
|
||||||
|
|
||||||
console_lock();
|
console_lock();
|
||||||
|
|
||||||
for_each_console(c) {
|
for_each_console(c) {
|
||||||
if (con && con != c)
|
if (con && con != c)
|
||||||
continue;
|
continue;
|
||||||
|
@ -3389,11 +3390,19 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
|
||||||
if (printk_seq < seq)
|
if (printk_seq < seq)
|
||||||
diff += seq - printk_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;
|
remaining = timeout_ms;
|
||||||
|
|
||||||
|
console_unlock();
|
||||||
|
|
||||||
if (diff == 0 || remaining == 0)
|
if (diff == 0 || remaining == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче