From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756383AbcK2OC5 (ORCPT ); Tue, 29 Nov 2016 09:02:57 -0500 Received: from mx2.suse.de ([195.135.220.15]:54233 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751872AbcK2OCs (ORCPT ); Tue, 29 Nov 2016 09:02:48 -0500 Date: Tue, 29 Nov 2016 15:02:40 +0100 From: Petr Mladek To: Peter Zijlstra Cc: Sergey Senozhatsky , Andrew Morton , Jan Kara , Tejun Heo , Calvin Owens , Thomas Gleixner , Mel Gorman , Steven Rostedt , Ingo Molnar , linux-kernel@vger.kernel.org Subject: Re: [PATCH 2/3] early_printk: Add force_early_printk kernel parameter Message-ID: <20161129140240.GC21230@pathway.suse.cz> References: <20161018170830.405990950@infradead.org> <20161018171513.665287338@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20161018171513.665287338@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue 2016-10-18 19:08:32, Peter Zijlstra wrote: > Add add the 'force_early_printk' kernel parameter to override printk() > and force it into early_printk(). This bypasses all the cruft and fail > from printk() and makes things work again. IMHO, the patch makes perfect sense and helps with debugging hard problems. > --- a/kernel/printk/printk.c > +++ b/kernel/printk/printk.c > @@ -1751,10 +1787,13 @@ asmlinkage int vprintk_emit(int facility > static unsigned int logbuf_cpu = UINT_MAX; > > #ifdef CONFIG_KGDB_KDB > - if (unlikely(kdb_trap_printk)) { > - r = vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); > - return r; > - } > + if (unlikely(kdb_trap_printk)) > + return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); > +#endif Please, find below an updated patch that has also my Reviewed-by. In particular, the above change was moved to the first patch to fix bisectability. The result after applying both patches is still exactly the same. >>From e1c00ae67d07767ec8e5bddb1113c2badf31f4bd Mon Sep 17 00:00:00 2001 From: Petr Mladek Date: Tue, 29 Nov 2016 13:32:56 +0100 Subject: [PATCH 2/3] early_printk: Add force_early_printk kernel parameter Add add the 'force_early_printk' kernel parameter to override printk() and force it into early_printk(). This bypasses all the cruft and fail from printk() and makes things work again. Signed-off-by: Peter Zijlstra (Intel) Reviewed-by: Petr Mladek --- kernel/printk/printk.c | 68 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 541ce7705353..bb612e5c2e00 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -344,6 +344,42 @@ __packed __aligned(4) #endif ; +#ifdef CONFIG_EARLY_PRINTK +struct console *early_console; + +static bool __read_mostly force_early_printk; + +static int __init force_early_printk_setup(char *str) +{ + force_early_printk = true; + return 0; +} +early_param("force_early_printk", force_early_printk_setup); + +static int early_vprintk(const char *fmt, va_list args) +{ + char buf[512]; + int n; + + n = vscnprintf(buf, sizeof(buf), fmt, args); + early_console->write(early_console, buf, n); + + return n; +} + +asmlinkage __visible void early_printk(const char *fmt, ...) +{ + va_list ap; + + if (!early_console) + return; + + va_start(ap, fmt); + early_vprintk(fmt, ap); + va_end(ap); +} +#endif + /* * The logbuf_lock protects kmsg buffer, indices, counters. This can be taken * within the scheduler's rq lock. It must be released before calling @@ -1786,6 +1822,11 @@ asmlinkage int vprintk_emit(int facility, int level, return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); #endif +#ifdef CONFIG_EARLY_PRINTK + if (force_early_printk && early_console) + return early_vprintk(fmt, args); +#endif + if (level == LOGLEVEL_SCHED) { level = LOGLEVEL_DEFAULT; in_sched = true; @@ -1959,7 +2000,12 @@ asmlinkage __visible int printk(const char *fmt, ...) int r; va_start(args, fmt); - r = vprintk_func(fmt, args); +#ifdef CONFIG_EARLY_PRINTK + if (force_early_printk && early_console) + r = vprintk_default(fmt, args); + else +#endif + r = vprintk_func(fmt, args); va_end(args); return r; @@ -2009,26 +2055,6 @@ static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev, #endif /* CONFIG_PRINTK */ -#ifdef CONFIG_EARLY_PRINTK -struct console *early_console; - -asmlinkage __visible void early_printk(const char *fmt, ...) -{ - va_list ap; - char buf[512]; - int n; - - if (!early_console) - return; - - va_start(ap, fmt); - n = vscnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - - early_console->write(early_console, buf, n); -} -#endif - static int __add_preferred_console(char *name, int idx, char *options, char *brl_options) { -- 1.8.5.6