From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755397AbdC2J3d (ORCPT ); Wed, 29 Mar 2017 05:29:33 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:36439 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755285AbdC2J33 (ORCPT ); Wed, 29 Mar 2017 05:29:29 -0400 From: Sergey Senozhatsky To: Steven Rostedt , Petr Mladek Cc: Jan Kara , Andrew Morton , Linus Torvalds , Peter Zijlstra , "Rafael J . Wysocki" , Eric Biederman , Greg Kroah-Hartman , Jiri Slaby , Pavel Machek , Len Brown , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Sergey Senozhatsky Subject: [RFC][PATCHv2 5/8] sysrq: switch to printk.emergency mode in unsafe places Date: Wed, 29 Mar 2017 18:25:08 +0900 Message-Id: <20170329092511.3958-6-sergey.senozhatsky@gmail.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20170329092511.3958-1-sergey.senozhatsky@gmail.com> References: <20170329092511.3958-1-sergey.senozhatsky@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It's not always possible/safe to wake_up() printk kernel thread from sysrq (theoretically). Thus we better switch printk() to emergency mode in some of the sysrq handlers, which allows us to immediately flush pending kernel message to the console. This patch adds printk_emergency_begin/on sections. Signed-off-by: Sergey Senozhatsky Suggested-by: Tetsuo Handa --- drivers/tty/sysrq.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index c6fc7141d7b2..817dfb69914d 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -239,6 +240,7 @@ static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus); static void sysrq_handle_showallcpus(int key) { + printk_emergency_begin(); /* * Fall back to the workqueue based printing if the * backtrace printing did not succeed or the @@ -253,6 +255,7 @@ static void sysrq_handle_showallcpus(int key) } schedule_work(&sysrq_showallcpus); } + printk_emergency_end(); } static struct sysrq_key_op sysrq_showallcpus_op = { @@ -279,8 +282,10 @@ static struct sysrq_key_op sysrq_showregs_op = { static void sysrq_handle_showstate(int key) { + printk_emergency_begin(); show_state(); show_workqueue_state(); + printk_emergency_end(); } static struct sysrq_key_op sysrq_showstate_op = { .handler = sysrq_handle_showstate, @@ -291,7 +296,9 @@ static struct sysrq_key_op sysrq_showstate_op = { static void sysrq_handle_showstate_blocked(int key) { + printk_emergency_begin(); show_state_filter(TASK_UNINTERRUPTIBLE); + printk_emergency_end(); } static struct sysrq_key_op sysrq_showstate_blocked_op = { .handler = sysrq_handle_showstate_blocked, -- 2.12.2