From patchwork Sat Apr 23 03:49:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 8916841 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id EE6B1BF29F for ; Sat, 23 Apr 2016 03:49:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EDF1D20212 for ; Sat, 23 Apr 2016 03:49:50 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0D270201F2 for ; Sat, 23 Apr 2016 03:49:50 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1atoYK-0001rG-Gv; Sat, 23 Apr 2016 03:48:16 +0000 Received: from mail-pf0-x22f.google.com ([2607:f8b0:400e:c00::22f]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1atoYH-0001oW-Pf for linux-arm-kernel@lists.infradead.org; Sat, 23 Apr 2016 03:48:14 +0000 Received: by mail-pf0-x22f.google.com with SMTP id y69so28210098pfb.1 for ; Fri, 22 Apr 2016 20:47:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=O7PAd1hOrL6Z1DpfYdDUCxDjTouW1Bw+s49eUnolFwE=; b=sQGtsdinYRBT4VGphAWwDtlTygbujmnrsizotEiV6tRvkbbw7dK8tOeQSfn4zxqUEd BOZarAOUYEP6VWI3gCBiJ4/QuxzqikiRTdxFVzKFt4LaNJx59TBp4znUCThtXOioA0b6 8HXRyeGFVtdbXvMdvcMR0rL73x0jBn0ScBLeTuqAp/UKLVJ4+1Xu3lQOUVtZ35V60Gzm yHXi2CoAUofnBoAkl+v1+XSo1xGW6xIMD72zZctBXLu1WiJZ9adpwtNWMBkQVan+XL99 RpQRPtcYh1rvyQxC8QBwdr//FWA/Dxw5bPZ+olz2VIGOQo75saXvaIRATuBzEbDrDO0j AvCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=O7PAd1hOrL6Z1DpfYdDUCxDjTouW1Bw+s49eUnolFwE=; b=krIReMwc+oaba1p5f+2hMHQTG5isHS6XgZ6yzFVg9ayKiSVoAT9Lta/XWxcbAnb9Ik DQsVQZjTrFtzNX2IGiyaUH5peRiY45K8dQQvoJMN2zMZQ9LcHIFVlu83OMOWd/IguuIN i8Bn7OSuzK3lHxk96s2GZwbs5/qZeBbOuUzFZPKvyJH/68NcF7myPrXzHRK8WwKizxqM UJEzx/rMCeCzxduEQAro6h9v37przO8Jp8JJ4zDY3FX6HcRzF4bl2vXAYCEGMFjXkoU8 eg+botVXTAC/d/vzA3xSLOT6al19cKUF54hjBVmA5fgU/zZkaO9IlpTbYwK6woEIrF0L 21eQ== X-Gm-Message-State: AOPr4FWOS9NPMNQpV0aee+TKydLhWRCVWegxYCr+955HLAWmUOaq2FLDdXM4hwhH+KRSxQ== X-Received: by 10.98.64.132 with SMTP id f4mr33712158pfd.146.1461383272594; Fri, 22 Apr 2016 20:47:52 -0700 (PDT) Received: from localhost ([110.70.15.194]) by smtp.gmail.com with ESMTPSA id qb1sm12586397pac.44.2016.04.22.20.47.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Apr 2016 20:47:51 -0700 (PDT) Date: Sat, 23 Apr 2016 12:49:24 +0900 From: Sergey Senozhatsky To: Petr Mladek Subject: Re: [PATCH v5 4/4] printk/nmi: flush NMI messages on the system panic Message-ID: <20160423034924.GA535@swordfish> References: <1461239325-22779-1-git-send-email-pmladek@suse.com> <1461239325-22779-5-git-send-email-pmladek@suse.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1461239325-22779-5-git-send-email-pmladek@suse.com> User-Agent: Mutt/1.6.0 (2016-04-01) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160422_204813_905198_40A28767 X-CRM114-Status: GOOD ( 19.35 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-mips@linux-mips.org, Daniel Thompson , Jiri Kosina , Sergey Senozhatsky , linux-cris-kernel@axis.com, linux-s390@vger.kernel.org, Peter Zijlstra , x86@kernel.org, linux-kernel@vger.kernel.org, Steven Rostedt , adi-buildroot-devel@lists.sourceforge.net, Chris Metcalf , Ingo Molnar , linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, Russell King , Andrew Morton , linuxppc-dev@lists.ozlabs.org, Thomas Gleixner , linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-5.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hello Petr, On (04/21/16 13:48), Petr Mladek wrote: > extern void printk_nmi_flush(void); > +extern void printk_nmi_flush_on_panic(void); > #else > static inline void printk_nmi_flush(void) { } > +static inline void printk_nmi_flush_on_panic(void) { } [..] > +void printk_nmi_flush_on_panic(void) > +{ > + /* > + * Make sure that we could access the main ring buffer. > + * Do not risk a double release when more CPUs are up. > + */ > + if (in_nmi() && raw_spin_is_locked(&logbuf_lock)) { > + if (num_online_cpus() > 1) > + return; > + > + debug_locks_off(); > + raw_spin_lock_init(&logbuf_lock); > + } > + > + printk_nmi_flush(); > +} [..] > -static DEFINE_RAW_SPINLOCK(logbuf_lock); > +DEFINE_RAW_SPINLOCK(logbuf_lock); just an idea, how about doing it a bit differently? move printk_nmi_flush_on_panic() to printk.c, and place it next to printk_flush_on_panic() (so we will have two printk "flush-on-panic" functions sitting together). /* printk_nmi_flush() is in printk.h, so it's visible to printk anyway */ it also will let us keep logbuf_lock static, it's a bit too internal to printk to expose it, I think. IOW, something like this? --- kernel/printk/internal.h | 2 -- kernel/printk/nmi.c | 27 --------------------------- kernel/printk/printk.c | 29 ++++++++++++++++++++++++++++- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h index 7fd2838..341bedc 100644 --- a/kernel/printk/internal.h +++ b/kernel/printk/internal.h @@ -22,8 +22,6 @@ int __printf(1, 0) vprintk_default(const char *fmt, va_list args); #ifdef CONFIG_PRINTK_NMI -extern raw_spinlock_t logbuf_lock; - /* * printk() could not take logbuf_lock in NMI context. Instead, * it temporary stores the strings into a per-CPU buffer. diff --git a/kernel/printk/nmi.c b/kernel/printk/nmi.c index b69eb8a..b68a9864 100644 --- a/kernel/printk/nmi.c +++ b/kernel/printk/nmi.c @@ -204,33 +204,6 @@ void printk_nmi_flush(void) __printk_nmi_flush(&per_cpu(nmi_print_seq, cpu).work); } -/** - * printk_nmi_flush_on_panic - flush all per-cpu nmi buffers when the system - * goes down. - * - * Similar to printk_nmi_flush() but it can be called even in NMI context when - * the system goes down. It does the best effort to get NMI messages into - * the main ring buffer. - * - * Note that it could try harder when there is only one CPU online. - */ -void printk_nmi_flush_on_panic(void) -{ - /* - * Make sure that we could access the main ring buffer. - * Do not risk a double release when more CPUs are up. - */ - if (in_nmi() && raw_spin_is_locked(&logbuf_lock)) { - if (num_online_cpus() > 1) - return; - - debug_locks_off(); - raw_spin_lock_init(&logbuf_lock); - } - - printk_nmi_flush(); -} - void __init printk_nmi_init(void) { int cpu; diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 0a0e789..1509baa 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -245,7 +245,7 @@ __packed __aligned(4) * within the scheduler's rq lock. It must be released before calling * console_unlock() or anything else that might wake up a process. */ -DEFINE_RAW_SPINLOCK(logbuf_lock); +static DEFINE_RAW_SPINLOCK(logbuf_lock); #ifdef CONFIG_PRINTK DECLARE_WAIT_QUEUE_HEAD(log_wait); @@ -2447,6 +2447,33 @@ void console_unblank(void) } /** + * printk_nmi_flush_on_panic - flush all per-cpu nmi buffers when the system + * goes down. + * + * Similar to printk_nmi_flush() but it can be called even in NMI context when + * the system goes down. It does the best effort to get NMI messages into + * the main ring buffer. + * + * Note that it could try harder when there is only one CPU online. + */ +void printk_nmi_flush_on_panic(void) +{ + /* + * Make sure that we could access the main ring buffer. + * Do not risk a double release when more CPUs are up. + */ + if (in_nmi() && raw_spin_is_locked(&logbuf_lock)) { + if (num_online_cpus() > 1) + return; + + debug_locks_off(); + raw_spin_lock_init(&logbuf_lock); + } + + printk_nmi_flush(); +} + +/** * console_flush_on_panic - flush console content on panic * * Immediately output all pending messages no matter what.