Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751464AbbEYMrF (ORCPT ); Mon, 25 May 2015 08:47:05 -0400 Received: from cantor2.suse.de ([195.135.220.15]:53584 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751203AbbEYMrA (ORCPT ); Mon, 25 May 2015 08:47:00 -0400 From: Petr Mladek To: Andrew Morton Cc: Frederic Weisbecker , Steven Rostedt , Dave Anderson , "Paul E. McKenney" , Kay Sievers , Jiri Kosina , Michal Hocko , Jan Kara , linux-kernel@vger.kernel.org, Wang Long , peifeiyue@huawei.com, dzickus@redhat.com, morgan.wang@huawei.com, sasha.levin@oracle.com, Petr Mladek Subject: [PATCH 04/10] printk: Merge and flush NMI buffer predictably via IRQ work Date: Mon, 25 May 2015 14:46:27 +0200 Message-Id: <1432557993-20458-5-git-send-email-pmladek@suse.cz> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1432557993-20458-1-git-send-email-pmladek@suse.cz> References: <1432557993-20458-1-git-send-email-pmladek@suse.cz> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1778 Lines: 50 It might take ages until users see messages from NMI context. They cannot be flushed to the console because the operation involves taking and releasing a bunch of locks. Everything gets fixed by the followup printk in normal context but it is not predictable. The same problem has printk_sched() and this patch reuses the existing solution. There is no special printk() variant for NMI context. Hence the IRQ work need to get queued from vprintk_emit(). Signed-off-by: Petr Mladek --- kernel/printk/printk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index bf2abdda5869..c2ae9ff388ae 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1554,9 +1554,6 @@ int printk_deferred(const char *fmt, ...) va_start(args, fmt); r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, 0, fmt, args); va_end(args); - - __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT); - irq_work_queue(this_cpu_ptr(&wake_up_klogd_work)); preempt_enable(); return r; @@ -1880,7 +1877,10 @@ asmlinkage int vprintk_emit(int facility, int level, * If called from the scheduler or NMI context, we can not get console * without a possible deadlock. */ - if (!in_sched && !in_nmi()) { + if (in_sched || in_nmi()) { + __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT); + irq_work_queue(this_cpu_ptr(&wake_up_klogd_work)); + } else { lockdep_off(); /* * Disable preemption to avoid being preempted while holding -- 1.8.5.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/