From: Nick Piggin <nickpiggin@yahoo.com.au>
To: Ingo Molnar <mingo@elte.hu>
Cc: Stefano Brivio <stefano.brivio@polimi.it>,
Robert Love <rml@tech9.net>,
linux-kernel@vger.kernel.org, Dave Jones <davej@redhat.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>, Michael Buesch <mb@bu3sch.de>,
Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>,
Len Brown <lenb@kernel.org>
Subject: Re: [PATCH] scheduler: fix x86 regression in native_sched_clock
Date: Wed, 12 Dec 2007 15:42:45 +1100 [thread overview]
Message-ID: <200712121542.45957.nickpiggin@yahoo.com.au> (raw)
In-Reply-To: <20071208085207.GE30997@elte.hu>
On Saturday 08 December 2007 19:52, Ingo Molnar wrote:
> the scariest bit is the adding of cpu_clock() to kernel/printk.c so late
> in the game, and the anti-recursion code i did there. Maybe because this
> only affects CONFIG_PRINTK_TIME we could try it even for v2.6.24.
Printk recursion I guess shouldn't happen, but if there is a bug
somewhere in eg. the scheduler locking, then it may trigger, right?
Probably pretty rare case, however it would be nice to be able to
find out where the recursion comes from? Can you put an instruction
pointer in the recursion message perhaps?
> i've now completed a couple of hundred random bootups on x86 overnight,
> with the full stack of these patches applied, and no problems.
>
> Could have a really critical look at the two patches below and give your
> Reviewed-by line(s) if you agree with having them in v2.6.24? I'd feel a
> lot better about this that way :-) I do have the feeling that it makes
> printk printout a lot more robust in general, independently of the
> cpu_clock() change - especially with more complex consoles like
> netconsole or fbcon.
Reviewed-by: Nick Piggin <npiggin@suse.de>
for both of them. However I don't feel good to get this into 2.6.24
just for printk timestamps :P But if you can convince others, I won't
stand in your way ;)
BTW. shouldn't we still disable the tsc for this machine for 2.6.24?
Because even if you did get these patches in, the sched_clock still
goes pretty wild if the tsc is not constant. cpu_clock can filter it
somewhat, but it would still lead to wrong values...
Nick
>
> Ingo
>
> -------------------->
> Subject: printk: make printk more robust by not allowing recursion
> From: Ingo Molnar <mingo@elte.hu>
>
> make printk more robust by allowing recursion only if there's a crash
> going on. Also add recursion detection.
>
> I've tested it with an artificially injected printk recursion - instead
> of a lockup or spontaneous reboot or other crash, the output was a well
> controlled:
>
> [ 41.057335] SysRq : <2>BUG: recent printk recursion!
> [ 41.057335] loglevel0-8 reBoot Crashdump show-all-locks(D) tErm Full
> kIll saK showMem Nice powerOff showPc show-all-timers(Q) unRaw Sync
> showTasks Unmount shoW-blocked-tasks
>
> also do all this printk-debug logic with irqs disabled.
>
> Signed-off-by: Ingo Molnar <mingo@elte.hu>
> ---
> kernel/printk.c | 48 ++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 38 insertions(+), 10 deletions(-)
>
> Index: linux/kernel/printk.c
> ===================================================================
> --- linux.orig/kernel/printk.c
> +++ linux/kernel/printk.c
> @@ -628,30 +628,57 @@ asmlinkage int printk(const char *fmt, .
> /* cpu currently holding logbuf_lock */
> static volatile unsigned int printk_cpu = UINT_MAX;
>
> +const char printk_recursion_bug_msg [] =
> + KERN_CRIT "BUG: recent printk recursion!\n";
> +static int printk_recursion_bug;
> +
> asmlinkage int vprintk(const char *fmt, va_list args)
> {
> + static int log_level_unknown = 1;
> + static char printk_buf[1024];
> +
> unsigned long flags;
> - int printed_len;
> + int printed_len = 0;
> + int this_cpu;
> char *p;
> - static char printk_buf[1024];
> - static int log_level_unknown = 1;
>
> boot_delay_msec();
>
> preempt_disable();
> - if (unlikely(oops_in_progress) && printk_cpu == smp_processor_id())
> - /* If a crash is occurring during printk() on this CPU,
> - * make sure we can't deadlock */
> - zap_locks();
> -
> /* This stops the holder of console_sem just where we want him */
> raw_local_irq_save(flags);
> + this_cpu = smp_processor_id();
> +
> + /*
> + * Ouch, printk recursed into itself!
> + */
> + if (unlikely(printk_cpu == this_cpu)) {
> + /*
> + * If a crash is occurring during printk() on this CPU,
> + * then try to get the crash message out but make sure
> + * we can't deadlock. Otherwise just return to avoid the
> + * recursion and return - but flag the recursion so that
> + * it can be printed at the next appropriate moment:
> + */
> + if (!oops_in_progress) {
> + printk_recursion_bug = 1;
> + goto out_restore_irqs;
> + }
> + zap_locks();
> + }
> +
> lockdep_off();
> spin_lock(&logbuf_lock);
> - printk_cpu = smp_processor_id();
> + printk_cpu = this_cpu;
>
> + if (printk_recursion_bug) {
> + printk_recursion_bug = 0;
> + strcpy(printk_buf, printk_recursion_bug_msg);
> + printed_len = sizeof(printk_recursion_bug_msg);
> + }
> /* Emit the output into the temporary buffer */
> - printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args);
> + printed_len += vscnprintf(printk_buf + printed_len,
> + sizeof(printk_buf), fmt, args);
>
> /*
> * Copy the output into log_buf. If the caller didn't provide
> @@ -744,6 +771,7 @@ asmlinkage int vprintk(const char *fmt,
> printk_cpu = UINT_MAX;
> spin_unlock(&logbuf_lock);
> lockdep_on();
> +out_restore_irqs:
> raw_local_irq_restore(flags);
> }
>
> -------------------->
> Subject: sched: fix CONFIG_PRINT_TIME's reliance on sched_clock()
> From: Ingo Molnar <mingo@elte.hu>
>
> Stefano Brivio reported weird printk timestamp behavior during
> CPU frequency changes:
>
> http://bugzilla.kernel.org/show_bug.cgi?id=9475
>
> fix CONFIG_PRINT_TIME's reliance on sched_clock() and use cpu_clock()
> instead.
>
> Reported-and-bisected-by: Stefano Brivio <stefano.brivio@polimi.it>
> Signed-off-by: Ingo Molnar <mingo@elte.hu>
> ---
> kernel/printk.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> Index: linux/kernel/printk.c
> ===================================================================
> --- linux.orig/kernel/printk.c
> +++ linux/kernel/printk.c
> @@ -707,7 +707,7 @@ asmlinkage int vprintk(const char *fmt,
> loglev_char = default_message_loglevel
> + '0';
> }
> - t = printk_clock();
> + t = cpu_clock(printk_cpu);
> nanosec_rem = do_div(t, 1000000000);
> tlen = sprintf(tbuf,
> "<%c>[%5lu.%06lu] ",
next prev parent reply other threads:[~2007-12-12 4:43 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-07 1:19 Stefano Brivio
2007-12-07 5:29 ` Nick Piggin
2007-12-07 5:51 ` Thomas Gleixner
2007-12-07 7:18 ` Guillaume Chazarain
2007-12-07 8:02 ` Guillaume Chazarain
2007-12-07 8:51 ` Ingo Molnar
2007-12-07 9:29 ` Guillaume Chazarain
2007-12-07 9:59 ` Ingo Molnar
2007-12-07 13:55 ` [patch] x86: scale cyc_2_nsec according to CPU frequency Ingo Molnar
2007-12-07 14:27 ` Guillaume Chazarain
2007-12-07 14:52 ` Ingo Molnar
2007-12-08 15:57 ` Arjan van de Ven
2007-12-08 19:16 ` Ingo Molnar
2007-12-08 20:18 ` Arjan van de Ven
2007-12-07 10:37 ` [PATCH] scheduler: fix x86 regression in native_sched_clock Andi Kleen
2007-12-07 8:45 ` Ingo Molnar
2007-12-07 10:32 ` Andrew Morton
2007-12-07 10:40 ` Ingo Molnar
2007-12-07 11:07 ` Ingo Molnar
2007-12-07 11:09 ` Andrew Morton
2007-12-07 11:12 ` Ingo Molnar
2007-12-07 11:13 ` Nick Piggin
2007-12-07 11:17 ` Ingo Molnar
2007-12-07 16:48 ` Nick Piggin
2007-12-08 0:50 ` Nick Piggin
2007-12-08 0:57 ` Nick Piggin
2007-12-08 8:52 ` Ingo Molnar
2007-12-08 23:37 ` Guillaume Chazarain
2007-12-12 4:42 ` Nick Piggin [this message]
2007-12-12 10:44 ` Ingo Molnar
2007-12-07 11:18 ` Guillaume Chazarain
2007-12-07 11:57 ` Guillaume Chazarain
2007-12-07 11:23 ` stefano.brivio
2007-12-07 12:11 ` Ingo Molnar
2007-12-07 12:25 ` Ingo Molnar
2007-12-07 12:35 ` Ingo Molnar
2007-12-07 12:40 ` Ingo Molnar
2007-12-07 14:54 ` Ingo Molnar
2007-12-07 16:46 ` Guillaume Chazarain
2007-12-07 17:57 ` Ingo Molnar
2007-12-08 15:06 ` Mark Lord
2007-12-08 15:13 ` Ingo Molnar
2007-12-08 15:27 ` Michael Buesch
2007-12-08 15:33 ` Ingo Molnar
2007-12-08 15:36 ` Michael Buesch
2007-12-08 15:41 ` Ingo Molnar
2007-12-07 11:24 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200712121542.45957.nickpiggin@yahoo.com.au \
--to=nickpiggin@yahoo.com.au \
--cc=akpm@linux-foundation.org \
--cc=davej@redhat.com \
--cc=lenb@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mb@bu3sch.de \
--cc=mingo@elte.hu \
--cc=rjw@sisk.pl \
--cc=rml@tech9.net \
--cc=stefano.brivio@polimi.it \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®