Messages in this thread | | | Date | Thu, 2 Feb 2017 17:56:41 +0100 | From | Petr Mladek <> | Subject | Re: [PATCH] printk: use console_trylock() in console_cpu_notify() |
| |
On Thu 2017-02-02 12:53:47, Sergey Senozhatsky wrote: > Hello, > > thanks for taking a look, Petr. > > On (01/25/17 16:02), Petr Mladek wrote: > [..] > > > Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> > > > --- > > > kernel/printk/printk.c | 11 ++++++----- > > > 1 file changed, 6 insertions(+), 5 deletions(-) > > > > > > diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c > > > index 7180088cbb23..772eb16436ce 100644 > > > --- a/kernel/printk/printk.c > > > +++ b/kernel/printk/printk.c > > > @@ -2028,15 +2028,16 @@ void resume_console(void) > > > * @cpu: unused > > > * > > > * If printk() is called from a CPU that is not online yet, the messages > > > - * will be spooled but will not show up on the console. This function is > > > - * called when a new CPU comes online (or fails to come up), and ensures > > > - * that any such output gets printed. > > > + * will be printed on the console only if there are CON_ANYTIME consoles. > > > + * This function is called when a new CPU comes online (or fails to come > > > + * up) or goes offline. > > > */ > > > static int console_cpu_notify(unsigned int cpu) > > > { > > > if (!cpuhp_tasks_frozen) { > > > - console_lock(); > > > - console_unlock(); > > > + /* If trylock fails, someone else is doing the printing */ > > > + if (console_trylock()) > > > + console_unlock(); > > > } > > > return 0; > > > } > > > > Rather theoretically, the other owner of console_sem might be > > on a CPU that is going online/offline and will refuse to print > > the messages. > > hm, if console_sem is locked by CPU that is going offline > then console_cpu_notify() will deadlock in console_lock(). > if I understood your point correctly.
No, it will not deadlock. I guess that it will just do nothing.
console_unlock() would probably return at the beginning because can_use_console() would return false because cpu_online() would return false.
I am not sure about it. It is not easy for me to find in which cpu_online() state the notifiers are called.
If the console really is not usable, we should rather defer the console work to another CPU.
Best Regards, Petr
| |