On Wed, 2007-05-16 at 08:35 +0200, Jan Kiszka wrote:
> Jan Kiszka wrote:
> > This is not a must-have, and it is not for all archs so far anyway:
> >
> > Dump an I-pipe panic trace on ordinary kernel oopses. For me this turned
> > out to be useful already, but not everyone may love to see his/her
> > console flooded with call-history traces on oops, though this only
> > happens if the tracer is enabled.
> >
> > Comments welcome.
> >
>
> Following your suggestion, this version makes the panic freezing a
> configurable option. Also, it adds support for x86_64 (note that all
> arch bits are in the same patch here!) and should now cover any arch
> I-pipe runs on.
>
Merged, thanks.
> I would say: No longer an RFC, now a request to apply.
>
> Jan
>
>
> ---
> arch/i386/mm/fault.c | 5 +++
> arch/x86_64/mm/fault.c | 3 ++
> include/linux/ipipe_trace.h | 10 +++----
> kernel/ipipe/Kconfig.debug | 18 +++++++++---
> kernel/ipipe/tracer.c | 62
> ++++++++++++++++++++++++--------------------
> lib/bust_spinlocks.c | 5 +++
> 6 files changed, 65 insertions(+), 38 deletions(-)
>
> Index: linux-2.6.20/arch/i386/mm/fault.c
> ===================================================================
> --- linux-2.6.20.orig/arch/i386/mm/fault.c
> +++ linux-2.6.20/arch/i386/mm/fault.c
> @@ -23,6 +23,7 @@
> #include <linux/module.h>
> #include <linux/kprobes.h>
> #include <linux/uaccess.h>
> +#include <linux/ipipe_trace.h>
>
> #include <asm/system.h>
> #include <asm/desc.h>
> @@ -68,9 +69,13 @@ void bust_spinlocks(int yes)
> int loglevel_save = console_loglevel;
>
> if (yes) {
> + ipipe_trace_panic_freeze();
> oops_in_progress = 1;
> return;
> }
> +
> + ipipe_trace_panic_dump();
> +
> #ifdef CONFIG_VT
> unblank_screen();
> #endif
> Index: linux-2.6.20/lib/bust_spinlocks.c
> ===================================================================
> --- linux-2.6.20.orig/lib/bust_spinlocks.c
> +++ linux-2.6.20/lib/bust_spinlocks.c
> @@ -12,14 +12,19 @@
> #include <linux/tty.h>
> #include <linux/wait.h>
> #include <linux/vt_kern.h>
> +#include <linux/ipipe_trace.h>
>
>
> void bust_spinlocks(int yes)
> {
> if (yes) {
> + ipipe_trace_panic_freeze();
> oops_in_progress = 1;
> } else {
> int loglevel_save = console_loglevel;
> +
> + ipipe_trace_panic_dump();
> +
> #ifdef CONFIG_VT
> unblank_screen();
> #endif
> Index: linux-2.6.20/include/linux/ipipe_trace.h
> ===================================================================
> --- linux-2.6.20.orig/include/linux/ipipe_trace.h
> +++ linux-2.6.20/include/linux/ipipe_trace.h
> @@ -2,7 +2,7 @@
> * include/linux/ipipe_trace.h
> *
> * Copyright (C) 2005 Luotao Fu.
> - * 2005, 2006 Jan Kiszka.
> + * 2005-2007 Jan Kiszka.
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License as published by
> @@ -23,8 +23,6 @@
> #ifndef _LINUX_IPIPE_TRACE_H
> #define _LINUX_IPIPE_TRACE_H
>
> -#ifdef CONFIG_IPIPE_TRACE
> -
> #include <linux/types.h>
>
> void ipipe_trace_begin(unsigned long v);
> @@ -36,14 +34,16 @@ void ipipe_trace_pid(pid_t pid, short pr
> int ipipe_trace_max_reset(void);
> int ipipe_trace_frozen_reset(void);
>
> +#ifdef CONFIG_IPIPE_TRACE_PANIC
> +
> void ipipe_trace_panic_freeze(void);
> void ipipe_trace_panic_dump(void);
>
> -#else /* !CONFIG_IPIPE_TRACE */
> +#else /* !CONFIG_IPIPE_TRACE_PANIC */
>
> static inline void ipipe_trace_panic_freeze(void) { }
> static inline void ipipe_trace_panic_dump(void) { }
>
> -#endif /* !CONFIG_IPIPE_TRACE */
> +#endif /* !CONFIG_IPIPE_TRACE_PANIC */
>
> #endif /* !__LINUX_IPIPE_H */
> Index: linux-2.6.20/kernel/ipipe/Kconfig.debug
> ===================================================================
> --- linux-2.6.20.orig/kernel/ipipe/Kconfig.debug
> +++ linux-2.6.20/kernel/ipipe/Kconfig.debug
> @@ -31,9 +31,10 @@ config IPIPE_TRACE
> in-kernel tracing API. The collected data and runtime control
> is available via /proc/ipipe/trace/*.
>
> +if IPIPE_TRACE
> +
> config IPIPE_TRACE_ENABLE
> bool "Enable tracing on boot"
> - depends on IPIPE_TRACE
> default y
> ---help---
> Disable this option if you want to arm the tracer after booting
> @@ -42,7 +43,6 @@ config IPIPE_TRACE_ENABLE
>
> config IPIPE_TRACE_MCOUNT
> bool "Instrument function entries"
> - depends on IPIPE_TRACE
> default y
> ---help---
> When enabled, records every kernel function entry in the tracer
> @@ -53,7 +53,6 @@ config IPIPE_TRACE_MCOUNT
>
> config IPIPE_TRACE_IRQSOFF
> bool "Trace IRQs-off times"
> - depends on IPIPE_TRACE
> default y
> ---help---
> Activate this option if I-pipe shall trace the longest path
> @@ -63,14 +62,12 @@ config IPIPE_TRACE_SHIFT
> int "Depth of trace log (14 => 16Kpoints, 15 => 32Kpoints)"
> range 10 18
> default 14
> - depends on IPIPE_TRACE
> ---help---
> The number of trace points to hold tracing data for each
> trace path, as a power of 2.
>
> config IPIPE_TRACE_VMALLOC
> bool "Use vmalloc'ed trace buffer"
> - depends on IPIPE_TRACE
> default y if EMBEDDED
> ---help---
> Instead of reserving static kernel data, the required buffer
> @@ -79,9 +76,20 @@ config IPIPE_TRACE_VMALLOC
> but it slightly degrades overall performance. Try this option
> when a traced kernel hangs unexpectedly at boot time.
>
> +config IPIPE_TRACE_PANIC
> + bool "Enable panic back traces"
> + default y
> + ---help---
> + Provides services to freeze and dump a back trace on panic
> + situations. This is used on IPIPE_DEBUG_CONTEXT exceptions
> + as well as ordinary kernel oopses. You can control the number
> + of printed back trace points via /proc/ipipe/trace.
> +
> config IPIPE_TRACE_ENABLE_VALUE
> int
> default 0 if !IPIPE_TRACE_ENABLE
> default 1 if IPIPE_TRACE_ENABLE
>
> endif
> +
> +endif
> Index: linux-2.6.20/kernel/ipipe/tracer.c
> ===================================================================
> --- linux-2.6.20.orig/kernel/ipipe/tracer.c
> +++ linux-2.6.20/kernel/ipipe/tracer.c
> @@ -132,7 +132,9 @@ static unsigned long trace_overhead;
>
> static DEFINE_MUTEX(out_mutex);
> static struct ipipe_trace_path *print_path;
> +#ifdef CONFIG_IPIPE_TRACE_PANIC
> static struct ipipe_trace_path *panic_path;
> +#endif /* CONFIG_IPIPE_TRACE_PANIC */
> static int print_pre_trace;
> static int print_post_trace;
>
> @@ -564,25 +566,6 @@ int ipipe_trace_frozen_reset(void)
> }
> EXPORT_SYMBOL(ipipe_trace_frozen_reset);
>
> -void ipipe_trace_panic_freeze(void)
> -{
> - unsigned long flags;
> - int cpuid;
> -
> - if (!ipipe_trace_enable)
> - return;
> -
> - ipipe_trace_enable = 0;
> - local_irq_save_hw_notrace(flags);
> -
> - cpuid = raw_smp_processor_id();
> -
> - panic_path = &trace_paths[cpuid][active_path[cpuid]];
> -
> - local_irq_restore_hw(flags);
> -}
> -EXPORT_SYMBOL(ipipe_trace_panic_freeze);
> -
> static void
> __ipipe_get_task_info(char *task_info, struct ipipe_trace_point *point,
> int trylock)
> @@ -615,6 +598,26 @@ __ipipe_get_task_info(char *task_info, s
> strcpy(task_info + (11 - strlen(buf)), buf);
> }
>
> +#ifdef CONFIG_IPIPE_TRACE_PANIC
> +void ipipe_trace_panic_freeze(void)
> +{
> + unsigned long flags;
> + int cpuid;
> +
> + if (!ipipe_trace_enable)
> + return;
> +
> + ipipe_trace_enable = 0;
> + local_irq_save_hw_notrace(flags);
> +
> + cpuid = raw_smp_processor_id();
> +
> + panic_path = &trace_paths[cpuid][active_path[cpuid]];
> +
> + local_irq_restore_hw(flags);
> +}
> +EXPORT_SYMBOL(ipipe_trace_panic_freeze);
> +
> void ipipe_trace_panic_dump(void)
> {
> int cnt = back_trace;
> @@ -681,6 +684,7 @@ void ipipe_trace_panic_dump(void)
> panic_path = NULL;
> }
> EXPORT_SYMBOL(ipipe_trace_panic_dump);
> +#endif /* CONFIG_IPIPE_TRACE_PANIC */
>
>
> /* --- /proc output --- */
> @@ -803,8 +807,17 @@ static void __ipipe_print_symname(struct
>
> sym_name = kallsyms_lookup(eip, &size, &offset, &modname, namebuf);
>
> - /* printing to /proc? */
> - if (m) {
> +#ifdef CONFIG_IPIPE_TRACE_PANIC
> + if (!m) {
> + /* panic dump */
> + if (sym_name) {
> + printk("%s+0x%lx", sym_name, offset);
> + if (modname)
> + printk(" [%s]", modname);
> + }
> + } else
> +#endif /* CONFIG_IPIPE_TRACE_PANIC */
> + {
> if (sym_name) {
> if (verbose_trace) {
> seq_printf(m, "%s+0x%lx", sym_name, offset);
> @@ -814,13 +827,6 @@ static void __ipipe_print_symname(struct
> seq_puts(m, sym_name);
> } else
> seq_printf(m, "<%08lx>", eip);
> - } else {
> - /* panic dump */
> - if (sym_name) {
> - printk("%s+0x%lx", sym_name, offset);
> - if (modname)
> - printk(" [%s]", modname);
> - }
> }
> }
>
> Index: linux-2.6.20/arch/x86_64/mm/fault.c
> ===================================================================
> --- linux-2.6.20.orig/arch/x86_64/mm/fault.c
> +++ linux-2.6.20/arch/x86_64/mm/fault.c
> @@ -24,6 +24,7 @@
> #include <linux/module.h>
> #include <linux/kprobes.h>
> #include <linux/uaccess.h>
> +#include <linux/ipipe_trace.h>
>
> #include <asm/system.h>
> #include <asm/pgalloc.h>
> @@ -73,8 +74,10 @@ void bust_spinlocks(int yes)
> {
> int loglevel_save = console_loglevel;
> if (yes) {
> + ipipe_trace_panic_freeze();
> oops_in_progress = 1;
> } else {
> + ipipe_trace_panic_dump();
> #ifdef CONFIG_VT
> unblank_screen();
> #endif
>
--
Philippe.
_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main