[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 |