From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752217AbdBBQ4y (ORCPT ); Thu, 2 Feb 2017 11:56:54 -0500 Received: from mx2.suse.de ([195.135.220.15]:42435 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751963AbdBBQ4v (ORCPT ); Thu, 2 Feb 2017 11:56:51 -0500 Date: Thu, 2 Feb 2017 17:56:41 +0100 From: Petr Mladek To: Sergey Senozhatsky Cc: Sergey Senozhatsky , Steven Rostedt , Andrew Morton , linux-kernel@vger.kernel.org, Thomas Gleixner , Sebastian Andrzej Siewior , Ingo Molnar Subject: Re: [PATCH] printk: use console_trylock() in console_cpu_notify() Message-ID: <20170202165641.GK23754@pathway.suse.cz> References: <20170121104729.8585-1-sergey.senozhatsky@gmail.com> <20170125150236.GF6620@pathway.suse.cz> <20170202035347.GE1954@jagdpanzerIV.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170202035347.GE1954@jagdpanzerIV.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > > > --- > > > 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