Messages in this thread | | | Subject | Re: [PATCH 1/3] Add tracing_off_event() to stop tracing when a bug or warning occur | From | Steven Rostedt <> | Date | Thu, 18 Mar 2010 10:56:07 -0400 |
| |
[ Expanded the Cc list ]
On Thu, 2010-03-18 at 09:48 -0400, Chase Douglas wrote: > The tracing_off_event() function calls tracing_off() to stop tracing > when an event occurs. By default, only BUG-type events stop tracing, > while WARNING type events do not. This is controlled through the > tracing_off={none,warn,bug} commandline parameter. > > Call this function from bug and warning event handlers to enable a user > to debug their kernel by starting a trace, hitting an event, and then > retrieving trace info knowing that the trace was stopped right after the > event was hit. > > Signed-off-by: Chase Douglas <chase.douglas@canonical.com> > --- > include/linux/kernel.h | 5 +++++ > kernel/trace/ring_buffer.c | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 39 insertions(+), 0 deletions(-) > > diff --git a/include/linux/kernel.h b/include/linux/kernel.h > index 7f07074..107091f 100644 > --- a/include/linux/kernel.h > +++ b/include/linux/kernel.h > @@ -478,16 +478,21 @@ static inline char *pack_hex_byte(char *buf, u8 byte) > * > * Most likely, you want to use tracing_on/tracing_off. > */ > +#define TRACE_EVENT_BUG 0 > +#define TRACE_EVENT_WARN 1
This should probably be an enum.
> + > #ifdef CONFIG_RING_BUFFER > void tracing_on(void); > void tracing_off(void); > /* trace_off_permanent stops recording with no way to bring it back */ > void tracing_off_permanent(void); > +void tracing_off_event(long event); > int tracing_is_on(void); > #else > static inline void tracing_on(void) { } > static inline void tracing_off(void) { } > static inline void tracing_off_permanent(void) { } > +static inline void tracing_off_event(long event) { } > static inline int tracing_is_on(void) { return 0; } > #endif > #ifdef CONFIG_TRACING > diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c > index 0287f9f..b148862 100644 > --- a/kernel/trace/ring_buffer.c > +++ b/kernel/trace/ring_buffer.c > @@ -193,6 +193,40 @@ void tracing_off_permanent(void) > set_bit(RB_BUFFERS_DISABLED_BIT, &ring_buffer_flags); > } > > +static long tracing_event_mask = TRACE_EVENT_BUG;
That's a bad name. It does not seem to be a mask but seems to be a control setting. Maybe call it tracing_event_off_ctrl ?
-- Steve
> + > +/** > + * tracing_off_event - turn off tracing depending on event type > + * > + * This function checks the event type to determine whether tracing should be > + * disabled. Useful for disabling tracing on bugs or warnings. > + */ > +void tracing_off_event(long event) > +{ > + if (event <= tracing_event_mask) > + tracing_off(); > +} > +EXPORT_SYMBOL_GPL(tracing_off_event); > + > +static int __init tracing_off_event_setup(char *str) > +{ > + if (!strcmp("none", str)) > + tracing_event_mask = -1; > + else if (!strcmp("bug", str)) > + tracing_event_mask = TRACE_EVENT_BUG; > + else if (!strcmp("warn", str)) > + tracing_event_mask = TRACE_EVENT_WARN; > + else > + { > + printk(KERN_NOTICE "Invalid value passed for tracing_off parameter\n"); > + return 1; > + } > + > + return 0; > +} > + > +__setup("tracing_off=", tracing_off_event_setup); > + > /** > * tracing_is_on - show state of ring buffers enabled > */
| |