|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] x86/debugtrace: Introduce a reset debugkey
When tracing a difference between two runs, it can be useful to reset the
trace count to help identify where the two traces diverge.
Move the count outside debugtrace_printk() it can be reset. Inline
debugtrace_toggle() into its single caller, so its prologue and epilogue can
be reused. Register a second keyhandler pointing at debugtrace_key(), and
select the action based on the key used.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Tim Deegan <tim@xxxxxxx>
---
xen/drivers/char/console.c | 64 +++++++++++++++++++++++++++-------------------
1 file changed, 37 insertions(+), 27 deletions(-)
diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
index 55ae31a..47ec0eb 100644
--- a/xen/drivers/char/console.c
+++ b/xen/drivers/char/console.c
@@ -961,6 +961,7 @@ static char *debugtrace_buf; /* Debug-trace buffer */
static unsigned int debugtrace_prd; /* Producer index */
static unsigned int debugtrace_kilobytes = 128, debugtrace_bytes;
static unsigned int debugtrace_used;
+static unsigned int debugtrace_count;
static DEFINE_SPINLOCK(debugtrace_lock);
integer_param("debugtrace", debugtrace_kilobytes);
@@ -984,29 +985,6 @@ static void debugtrace_dump_worker(void)
printk("debugtrace_dump() finished\n");
}
-static void debugtrace_toggle(void)
-{
- unsigned long flags;
-
- watchdog_disable();
- spin_lock_irqsave(&debugtrace_lock, flags);
-
- /*
- * Dump the buffer *before* toggling, in case the act of dumping the
- * buffer itself causes more printk() invocations.
- */
- printk("debugtrace_printk now writing to %s.\n",
- !debugtrace_send_to_console ? "console": "buffer");
- if ( !debugtrace_send_to_console )
- debugtrace_dump_worker();
-
- debugtrace_send_to_console = !debugtrace_send_to_console;
-
- spin_unlock_irqrestore(&debugtrace_lock, flags);
- watchdog_enable();
-
-}
-
void debugtrace_dump(void)
{
unsigned long flags;
@@ -1023,7 +1001,6 @@ void debugtrace_dump(void)
void debugtrace_printk(const char *fmt, ...)
{
static char buf[1024];
- static u32 count;
va_list args;
char *p;
@@ -1038,7 +1015,7 @@ void debugtrace_printk(const char *fmt, ...)
ASSERT(debugtrace_buf[debugtrace_bytes - 1] == 0);
- snprintf(buf, sizeof(buf), "%u ", ++count);
+ snprintf(buf, sizeof(buf), "%u ", ++debugtrace_count);
va_start(args, fmt);
(void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt, args);
@@ -1064,7 +1041,38 @@ void debugtrace_printk(const char *fmt, ...)
static void debugtrace_key(unsigned char key)
{
- debugtrace_toggle();
+ unsigned long flags;
+
+ watchdog_disable();
+ spin_lock_irqsave(&debugtrace_lock, flags);
+
+ if ( key == 'T' ) /* Toggle */
+ {
+ /*
+ * Dump the buffer *before* toggling, in case the act of dumping the
+ * buffer itself causes more printk() invocations.
+ */
+ printk("debugtrace_printk now writing to %s.\n",
+ !debugtrace_send_to_console ? "console": "buffer");
+ if ( !debugtrace_send_to_console )
+ debugtrace_dump_worker();
+
+ debugtrace_send_to_console = !debugtrace_send_to_console;
+ }
+ else if ( key == 'Y' ) /* Reset */
+ {
+ printk("Resetting debugtrace buffer and count\n");
+
+ memset(debugtrace_buf, '\0', debugtrace_bytes);
+ debugtrace_prd = 0;
+ debugtrace_count = 0;
+ debugtrace_used = 0;
+ }
+ else
+ printk("Unrecognised debugtrace key '%c'\n", key);
+
+ spin_unlock_irqrestore(&debugtrace_lock, flags);
+ watchdog_enable();
}
static int __init debugtrace_init(void)
@@ -1090,12 +1098,14 @@ static int __init debugtrace_init(void)
register_keyhandler('T', debugtrace_key,
"toggle debugtrace to console/buffer", 0);
+ register_keyhandler('Y', debugtrace_key,
+ "reset debugtrace buffer and count", 0);
return 0;
}
__initcall(debugtrace_init);
-#endif /* !NDEBUG */
+#endif /* !DEBUG_TRACE_DUMP */
/*
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |