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: 613973 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3qsJQ40Y2sz9t3h for ; Sat, 23 Apr 2016 13:49:16 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=sQGtsdin; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3qsJQ36bqSzDqHF for ; Sat, 23 Apr 2016 13:49:15 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=sQGtsdin; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mail-pf0-x232.google.com (mail-pf0-x232.google.com [IPv6:2607:f8b0:400e:c00::232]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3qsJNX1zZ4zDq60 for ; Sat, 23 Apr 2016 13:47:55 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=sQGtsdin; dkim-atps=neutral Received: by mail-pf0-x232.google.com with SMTP id 184so47388588pff.0 for ; Fri, 22 Apr 2016 20:47:55 -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=P7w6XPgCDKvGFxI6SUuKcR5Zem0Vdn3wao5yt5E32yAhTFuLRiTNPxGFAIQkfV9m7S oPrtRsA468DFe2Cp576gVK5hfBPL7231JUWTZO3apj0qhZAyPhmF9155prB/ZcW+gVal CgYL+FLCk0VWzau0IinD26ALnZZSTVKlnGsvc4GEJJVEBmdf6e8WRpwLXYn1lpCP4kpv St5HV1KCj9Q6K6vtTICE11rkSiKIewI31GLBjYXsXKB3J3RGTNHUXrn0GtT39PDw/qgv p7jrBHX2oHFb5+PMHmXHSAW/ql21NlKbZTD5zpPaLBPY4tx6bVXMy7KvjNeGet7B5Cqd cYJQ== X-Gm-Message-State: AOPr4FXtYxm7bp1tR+5Oax0S2RvcDRgw7QIh6AK+qbztVIonD5/a8AxO38WnktCw8Z3/7A== 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-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List 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 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" 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.