Message ID | 20250516034643.22355-1-tuhaowen@uniontech.com |
---|---|
State | New |
Headers | show |
Series | PM/console: Fix the black screen issue | expand |
On Fri, May 16, 2025 at 5:47 AM tuhaowen <tuhaowen@uniontech.com> wrote: > > When the computer enters sleep status without a monitor > connected, the system switches the console to the virtual > terminal tty63(SUSPEND_CONSOLE). > > If a monitor is subsequently connected before waking up, > the system skips the required VT restoration process > during wake-up, leaving the console on tty63 instead of > switching back to tty1. Please add some information here on how exactly the issue is being fixed. Reverse-engineering code changes is hard. > Signed-off-by: tuhaowen <tuhaowen@uniontech.com> > --- > kernel/power/console.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/kernel/power/console.c b/kernel/power/console.c > index fcdf0e14a47d..832e04bf5439 100644 > --- a/kernel/power/console.c > +++ b/kernel/power/console.c > @@ -16,6 +16,7 @@ > #define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) > > static int orig_fgconsole, orig_kmsg; > +static int vt_switch_done; > > static DEFINE_MUTEX(vt_switch_mutex); > > @@ -136,15 +137,19 @@ void pm_prepare_console(void) > if (orig_fgconsole < 0) > return; > > + vt_switch_done = 1; > + > orig_kmsg = vt_kmsg_redirect(SUSPEND_CONSOLE); > return; > } > > void pm_restore_console(void) > { > - if (!pm_vt_switch()) > + if (!pm_vt_switch() && !vt_switch_done) > return; > > + vt_switch_done = 0; > + > if (orig_fgconsole >= 0) { > vt_move_to_console(orig_fgconsole, 0); > vt_kmsg_redirect(orig_kmsg); > --
diff --git a/kernel/power/console.c b/kernel/power/console.c index fcdf0e14a47d..832e04bf5439 100644 --- a/kernel/power/console.c +++ b/kernel/power/console.c @@ -16,6 +16,7 @@ #define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1) static int orig_fgconsole, orig_kmsg; +static int vt_switch_done; static DEFINE_MUTEX(vt_switch_mutex); @@ -136,15 +137,19 @@ void pm_prepare_console(void) if (orig_fgconsole < 0) return; + vt_switch_done = 1; + orig_kmsg = vt_kmsg_redirect(SUSPEND_CONSOLE); return; } void pm_restore_console(void) { - if (!pm_vt_switch()) + if (!pm_vt_switch() && !vt_switch_done) return; + vt_switch_done = 0; + if (orig_fgconsole >= 0) { vt_move_to_console(orig_fgconsole, 0); vt_kmsg_redirect(orig_kmsg);
When the computer enters sleep status without a monitor connected, the system switches the console to the virtual terminal tty63(SUSPEND_CONSOLE). If a monitor is subsequently connected before waking up, the system skips the required VT restoration process during wake-up, leaving the console on tty63 instead of switching back to tty1. Signed-off-by: tuhaowen <tuhaowen@uniontech.com> --- kernel/power/console.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)