[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [XEN] Fix log-level printk logic for multi-line and partial-line printks.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID fac36a01c06e49dfedd4124ab45131e6c67dec60
# Parent  cfb1136ee8f73a07d0c6fed9dc6f4084d592c129
[XEN] Fix log-level printk logic for multi-line and partial-line printks.
Add support for switching to print-all mode, and use this for
debug-key output.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/common/keyhandler.c    |    4 +
 xen/drivers/char/console.c |  115 +++++++++++++++++++++++++++------------------
 xen/include/xen/console.h  |    3 +
 3 files changed, 76 insertions(+), 46 deletions(-)

diff -r cfb1136ee8f7 -r fac36a01c06e xen/common/keyhandler.c
--- a/xen/common/keyhandler.c   Fri Nov 03 10:52:29 2006 +0000
+++ b/xen/common/keyhandler.c   Fri Nov 03 11:15:10 2006 +0000
@@ -36,8 +36,10 @@ static void keypress_softirq(void)
 {
     keyhandler_t *h;
     unsigned char key = keypress_key;
+    console_start_log_everything();
     if ( (h = key_table[key].u.handler) != NULL )
         (*h)(key);
+    console_end_log_everything();
 }
 
 void handle_keypress(unsigned char key, struct cpu_user_regs *regs)
@@ -46,8 +48,10 @@ void handle_keypress(unsigned char key, 
 
     if ( key_table[key].flags & KEYHANDLER_IRQ_CALLBACK )
     {
+        console_start_log_everything();
         if ( (h = key_table[key].u.irq_handler) != NULL )
             (*h)(key, regs);
+        console_end_log_everything();
     }
     else
     {
diff -r cfb1136ee8f7 -r fac36a01c06e xen/drivers/char/console.c
--- a/xen/drivers/char/console.c        Fri Nov 03 10:52:29 2006 +0000
+++ b/xen/drivers/char/console.c        Fri Nov 03 11:15:10 2006 +0000
@@ -101,7 +101,7 @@ custom_param("loglvl", parse_loglvl);
 custom_param("loglvl", parse_loglvl);
 custom_param("guest_loglvl", parse_guest_loglvl);
 
-static int xen_startup = 1;
+static atomic_t print_everything = ATOMIC_INIT(1);
 
 #define ___parse_loglvl(s, ps, lvlstr, lvlnum)          \
     if ( !strncmp((s), (lvlstr), strlen(lvlstr)) ) {    \
@@ -380,7 +380,7 @@ long do_console_io(int cmd, int count, X
  * *****************************************************
  */
 
-static inline void __putstr(const char *str)
+static void __putstr(const char *str)
 {
     int c;
 
@@ -393,18 +393,47 @@ static inline void __putstr(const char *
     }
 }
 
+static int printk_prefix_check(char *p, char **pp)
+{
+    int loglvl = -1;
+    int upper_thresh = xenlog_upper_thresh;
+    int lower_thresh = xenlog_lower_thresh;
+
+    while ( (p[0] == '<') && (p[1] != '\0') && (p[2] == '>') )
+    {
+        switch ( p[1] )
+        {
+        case 'G':
+            upper_thresh = xenlog_guest_upper_thresh;
+            lower_thresh = xenlog_guest_lower_thresh;
+            if ( loglvl == -1 )
+                loglvl = XENLOG_GUEST_DEFAULT;
+            break;
+        case '0' ... '3':
+            loglvl = p[1] - '0';
+            break;
+        }
+        p += 3;
+    }
+
+    if ( loglvl == -1 )
+        loglvl = XENLOG_DEFAULT;
+
+    *pp = p;
+
+    return ((atomic_read(&print_everything) != 0) ||
+            (loglvl < lower_thresh) ||
+            ((loglvl < upper_thresh) && printk_ratelimit()));
+} 
+
 void printk(const char *fmt, ...)
 {
     static char   buf[1024];
-    static int    start_of_line = 1;
+    static int    start_of_line = 1, do_print;
 
     va_list       args;
     char         *p, *q;
     unsigned long flags;
-    int           level = -1;
-    int           upper_thresh = xenlog_upper_thresh;
-    int           lower_thresh = xenlog_lower_thresh;
-    int           print_regardless = xen_startup;
 
     /* console_lock can be acquired recursively from __printk_ratelimit(). */
     local_irq_save(flags);
@@ -416,41 +445,18 @@ void printk(const char *fmt, ...)
 
     p = buf;
 
-    while ( (p[0] == '<') && (p[1] != '\0') && (p[2] == '>') )
-    {
-        switch ( p[1] )
-        {
-        case 'G':
-            upper_thresh = xenlog_guest_upper_thresh;
-            lower_thresh = xenlog_guest_lower_thresh;
-            if ( level == -1 )
-                level = XENLOG_GUEST_DEFAULT;
-            break;
-        case '0' ... '3':
-            level = p[1] - '0';
-            break;
-        }
-        p += 3;
-    }
-
-    if ( level == -1 )
-        level = XENLOG_DEFAULT;
-
-    if ( !print_regardless )
-    {
-        if ( level >= upper_thresh )
-            goto out;
-        if ( (level >= lower_thresh) && (!printk_ratelimit()) )
-            goto out;
-    }
-
     while ( (q = strchr(p, '\n')) != NULL )
     {
         *q = '\0';
         if ( start_of_line )
-            __putstr(printk_prefix);
-        __putstr(p);
-        __putstr("\n");
+            do_print = printk_prefix_check(p, &p);
+        if ( do_print )
+        {
+            if ( start_of_line )
+                __putstr(printk_prefix);
+            __putstr(p);
+            __putstr("\n");
+        }
         start_of_line = 1;
         p = q + 1;
     }
@@ -458,12 +464,16 @@ void printk(const char *fmt, ...)
     if ( *p != '\0' )
     {
         if ( start_of_line )
-            __putstr(printk_prefix);
-        __putstr(p);
+            do_print = printk_prefix_check(p, &p);
+        if ( do_print )
+        {
+            if ( start_of_line )
+                __putstr(printk_prefix);
+            __putstr(p);
+        }
         start_of_line = 0;
     }
 
- out:
     spin_unlock_recursive(&console_lock);
     local_irq_restore(flags);
 }
@@ -524,7 +534,7 @@ void console_endboot(void)
     if ( opt_sync_console )
     {
         printk("**********************************************\n");
-        printk("******* WARNING: CONSOLE OUTPUT IS SYCHRONOUS\n");
+        printk("******* WARNING: CONSOLE OUTPUT IS SYNCHRONOUS\n");
         printk("******* This option is intended to aid debugging "
                "of Xen by ensuring\n");
         printk("******* that all output is synchronously delivered "
@@ -560,7 +570,17 @@ void console_endboot(void)
     switch_serial_input();
 
     /* Now we implement the logging thresholds. */
-    xen_startup = 0;
+    console_end_log_everything();
+}
+
+void console_start_log_everything(void)
+{
+    atomic_inc(&print_everything);
+}
+
+void console_end_log_everything(void)
+{
+    atomic_dec(&print_everything);
 }
 
 void console_force_unlock(void)
@@ -577,12 +597,14 @@ void console_force_lock(void)
 
 void console_start_sync(void)
 {
+    console_start_log_everything();
     serial_start_sync(sercon_handle);
 }
 
 void console_end_sync(void)
 {
     serial_end_sync(sercon_handle);
+    console_end_log_everything();
 }
 
 void console_putc(char c)
@@ -701,9 +723,10 @@ static void debugtrace_toggle(void)
     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's...
-    //
+    /*
+     * 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 )
diff -r cfb1136ee8f7 -r fac36a01c06e xen/include/xen/console.h
--- a/xen/include/xen/console.h Fri Nov 03 10:52:29 2006 +0000
+++ b/xen/include/xen/console.h Fri Nov 03 11:15:10 2006 +0000
@@ -26,6 +26,9 @@ void console_start_sync(void);
 void console_start_sync(void);
 void console_end_sync(void);
 
+void console_start_log_everything(void);
+void console_end_log_everything(void);
+
 /*
  * Steal output from the console. Returns +ve identifier, else -ve error.
  * Takes the handle of the serial line to steal, and steal callback function.

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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