From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752390AbdHOL7p (ORCPT ); Tue, 15 Aug 2017 07:59:45 -0400 Received: from cloudserver094114.home.net.pl ([79.96.170.134]:55589 "EHLO cloudserver094114.home.net.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751587AbdHOL7o (ORCPT ); Tue, 15 Aug 2017 07:59:44 -0400 From: "Rafael J. Wysocki" To: Sergey Senozhatsky Cc: Petr Mladek , Steven Rostedt , Jan Kara , Andrew Morton , Peter Zijlstra , Eric Biederman , Greg Kroah-Hartman , Jiri Slaby , Pavel Machek , Andreas Mohr , Tetsuo Handa , linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: Re: [RFC][PATCHv5 06/13] printk: register PM notifier Date: Tue, 15 Aug 2017 13:51:19 +0200 Message-ID: <10043624.VvthE8rrlX@aspire.rjw.lan> In-Reply-To: <20170815025625.1977-7-sergey.senozhatsky@gmail.com> References: <20170815025625.1977-1-sergey.senozhatsky@gmail.com> <20170815025625.1977-7-sergey.senozhatsky@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tuesday, August 15, 2017 4:56:18 AM CEST Sergey Senozhatsky wrote: > It's not always possible/safe to wake_up() printk kernel > thread. For example, late suspend/early resume may printk() > while timekeeping is not initialized yet, so calling into the > scheduler may result in recursive warnings. > > Another thing to notice is the fact that PM at some point > freezes user space and kernel threads: freeze_processes() > and freeze_kernel_threads(), correspondingly. Thus we need > printk() to operate in emergency mode there and attempt to > immediately flush pending kernel message to the console. > > This patch registers PM notifier, so PM can switch printk > to emergency mode from PM_FOO_PREPARE notifiers and return Isn't that too early? That's before user space is frozen even. > back to printk threaded mode from PM_POST_FOO notifiers. And isn't that too late? > Signed-off-by: Sergey Senozhatsky > Suggested-by: Andreas Mohr > --- > kernel/printk/printk.c | 35 +++++++++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > > diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c > index 05165f008bc8..d3f149fad85c 100644 > --- a/kernel/printk/printk.c > +++ b/kernel/printk/printk.c > @@ -49,6 +49,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -2913,6 +2914,33 @@ static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = { > .flags = IRQ_WORK_LAZY, > }; > > +static int printk_pm_notify(struct notifier_block *notify_block, > + unsigned long mode, void *unused) > +{ > + switch (mode) { > + case PM_HIBERNATION_PREPARE: > + case PM_SUSPEND_PREPARE: > + case PM_RESTORE_PREPARE: > + printk_emergency_begin_sync(); I'm not sure what would be wrong with calling this directly from dpm_suspend_noirq(). > + break; > + > + case PM_POST_SUSPEND: > + case PM_POST_HIBERNATION: > + case PM_POST_RESTORE: > + printk_emergency_end_sync(); And this could be called from dpm_resume_noirq(). In which case you wouldn't really need the stuff below. Thanks, Rafael