Hello, On (05/15/19 16:36), Petr Mladek wrote: [..] > > > > console_unlock(); > > console_sysfs_notify(); > > + console_lock(); > > I have got an idea how to get rid of this weirdness: > > 1. The check for bcon seems to be just an optimization. There is not need > to remove boot consoles when there are none. > > 2. The condition (newcon->flags & (CON_CONSDEV|CON_BOOT)) == CON_CONSDEV) > is valid only when the preferred console was really added. > > Therefore we could move the code to a separate function, e.g. > > void unregister_boot_consoles(void) > { > struct console *bcon; > > console_lock(); > for_each_console(bcon) > if (bcon->flags & CON_BOOT) > __unregister_console(bcon); > } > console_unlock(); > console_sysfs_notify(); > } > > Then we could do something like: > > void register_console(struct console *newcon) > { > bool newcon_is_preferred = false; > > console_lock(); > __register_console(newcon); > if ((newcon->flags & (CON_CONSDEV|CON_BOOT)) == CON_CONSDEV) > newcon_is_preferred = true; > console_unlock(); > console_sysfs_notify(); > > /* > * By unregistering the bootconsoles after we enable the real console > * we get the "console xxx enabled" message on all the consoles - > * boot consoles, real consoles, etc - this is to ensure that end > * users know there might be something in the kernel's log buffer that > * went to the bootconsole (that they do not see on the real console) > */ > if (newcon_is_preferred && !keep_bootcon) > unregister_boot_consoles(); > } > > How does that sound?
Hmm, may be I'm missing something. I think that the 'weirdness' is still needed. This console_lock(); __unregister_console(bcon); // pr_info("%sconsole disabled\n") console_unlock(); is going to change the visible behaviour - we need to show pr_info("%sconsole [%s%d] disabled\n") on all consoles, especially on the console which we are disabling. Who knows, maybe that's the last remaining properly working console. Doing __unregister_console() under console_sem will end up in a lost/missing message on bcon (or on any other console we are unregistering). -ss