[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.