Prev: Unify KVM kernel-space and user-space code into a single project
Next: [PATCH 4/5] x86: Merge kernel_math_error() into math_error()
From: Chase Douglas on 18 Mar 2010 14:30 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(a)canonical.com> --- include/linux/kernel.h | 7 +++++++ kernel/trace/ring_buffer.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 7f07074..a19d545 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -478,16 +478,23 @@ static inline char *pack_hex_byte(char *buf, u8 byte) * * Most likely, you want to use tracing_on/tracing_off. */ +typedef enum { + TRACE_EVENT_BUG = 0, + TRACE_EVENT_WARN, +} trace_event_t; + #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(trace_event_t 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(trace_event_t 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..202a677 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 trace_event_t tracing_off_event_ctrl = TRACE_EVENT_BUG; + +/** + * 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(trace_event_t event) +{ + if (event <= tracing_off_event_ctrl) + tracing_off(); +} +EXPORT_SYMBOL_GPL(tracing_off_event); + +static int __init tracing_off_event_setup(char *str) +{ + if (!strcmp("none", str)) + tracing_off_event_ctrl = -1; + else if (!strcmp("bug", str)) + tracing_off_event_ctrl = TRACE_EVENT_BUG; + else if (!strcmp("warn", str)) + tracing_off_event_ctrl = 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 */ -- 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |