All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3 v4] Add tracing_off_event() to stop tracing when a bug or warning occur
@ 2010-04-14 16:20 Chase Douglas
  2010-04-14 16:20 ` [PATCH 2/3] Add tracing_off_event() calls to BUG() and WARN() paths Chase Douglas
                   ` (2 more replies)
  0 siblings, 3 replies; 25+ messages in thread
From: Chase Douglas @ 2010-04-14 16:20 UTC (permalink / raw)
  To: linux-kernel
  Cc: Steven Rostedt, Frederic Weisbecker, Ingo Molnar, Thomas Gleixner,
	Randy Dunlap

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     |    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 9365227..80c67ad 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.
  */
+enum trace_off_event {
+	TRACE_EVENT_BUG = 0,
+	TRACE_EVENT_WARN,
+};
+
 #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(enum trace_off_event 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(enum trace_off_event 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 41ca394..f6be195 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -194,6 +194,40 @@ void tracing_off_permanent(void)
 	set_bit(RB_BUFFERS_DISABLED_BIT, &ring_buffer_flags);
 }
 
+static enum trace_off_event tracing_off_event_ctrl = TRACE_EVENT_BUG;
+
+/**
+ * tracing_off_event - turn off tracing depending on event type
+ * @event: type of event that occurred
+ *
+ * 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(enum trace_off_event 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.7.0


^ permalink raw reply related	[flat|nested] 25+ messages in thread
* [PATCH 1/3] Add tracing_off_event() to stop tracing when a bug or warning occur
@ 2010-03-18 13:48 Chase Douglas
  2010-03-18 13:48 ` [PATCH 2/3] Add tracing_off_event() calls to BUG() and WARN() paths Chase Douglas
  0 siblings, 1 reply; 25+ messages in thread
From: Chase Douglas @ 2010-03-18 13:48 UTC (permalink / raw)
  To: linux-kernel; +Cc: Steven Rostedt

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
+
 #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;
+
+/**
+ * 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
  */
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2010-04-19 22:30 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-14 16:20 [PATCH 1/3 v4] Add tracing_off_event() to stop tracing when a bug or warning occur Chase Douglas
2010-04-14 16:20 ` [PATCH 2/3] Add tracing_off_event() calls to BUG() and WARN() paths Chase Douglas
2010-04-15 20:57   ` Frederic Weisbecker
2010-04-15 21:49     ` Chase Douglas
2010-04-15 23:15       ` Frederic Weisbecker
2010-04-16  4:13         ` Chase Douglas
2010-04-14 16:20 ` [PATCH 3/3] Stop tracing on a schedule bug Chase Douglas
2010-04-15 21:03   ` Frederic Weisbecker
2010-04-15 21:45     ` Chase Douglas
2010-04-15 23:01       ` Thomas Gleixner
2010-04-15 23:10         ` Frederic Weisbecker
2010-04-15 23:27         ` Chase Douglas
2010-04-15 23:50           ` Thomas Gleixner
2010-04-16  0:21             ` Thomas Gleixner
2010-04-16  1:49               ` Frederic Weisbecker
2010-04-16 16:41                 ` Steven Rostedt
2010-04-16  4:01               ` Chase Douglas
2010-04-16 16:46                 ` Steven Rostedt
2010-04-16 17:14                   ` Chase Douglas
2010-04-16 18:14                   ` Frederic Weisbecker
2010-04-16 19:58                   ` Thomas Gleixner
2010-04-19 22:30               ` Chase Douglas
2010-04-16  3:52             ` Chase Douglas
2010-04-15 20:13 ` [PATCH 1/3 v4] Add tracing_off_event() to stop tracing when a bug or warning occur Frederic Weisbecker
  -- strict thread matches above, loose matches on Subject: below --
2010-03-18 13:48 [PATCH 1/3] " Chase Douglas
2010-03-18 13:48 ` [PATCH 2/3] Add tracing_off_event() calls to BUG() and WARN() paths Chase Douglas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.