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

Re: [Xen-devel] [PATCH] quiet bootup and add runtime tunable console log level


  • To: Alex Williamson <alex.williamson@xxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Keir Fraser <Keir.Fraser@xxxxxxxxxxxx>
  • Date: Wed, 07 Feb 2007 15:15:44 +0000
  • Delivery-date: Wed, 07 Feb 2007 07:15:33 -0800
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AcdKytYlFPC2HLa+EduXMAAX8io7RQ==
  • Thread-topic: [Xen-devel] [PATCH] quiet bootup and add runtime tunable console log level

Actually printing everything out during boot can be rather useful. What's
the downside? I think we should keep the current behaviour as default and
maybe add a 'quiet_boot' option or similar.

 -- Keir

On 7/2/07 05:38, "Alex Williamson" <alex.williamson@xxxxxx> wrote:

> 
>    We currently print everything during xen bootup regardless of what
> the user has specified on the boot line with loglvl.  This seems wrong
> and makes using XENLOG_DEBUG and XENLOG_INFO much less useful.  We also
> provide no means (that I could find) to change the console log level at
> runtime.  The patch below changes this to only print out console
> messages below the upper threshold during bootup, and toggles rate
> limiting at the end of the xen boot.  It also adds a simple inc/dec
> capability to the keyhandler to change the lower thresholds at runtime.
> The cmpxchgs are probably overkill, but maybe another interface will
> want to use these someday.  Thanks,
> 
> Alex
> 
> Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>
> ---
> 
> diff -r 7efb3a06c56a xen/common/keyhandler.c
> --- a/xen/common/keyhandler.c Tue Feb 06 15:20:26 2007 -0700
> +++ b/xen/common/keyhandler.c Tue Feb 06 21:21:13 2007 -0700
> @@ -258,6 +258,25 @@ extern void perfc_reset(unsigned char ke
>  extern void perfc_reset(unsigned char key);
>  #endif
>  
> +static void change_loglvl(unsigned char key)
> +{
> +    switch ( key )
> +    {
> +    case '+':
> +        console_inc_loglvl();
> +        break;
> +    case '-':
> +        console_dec_loglvl();
> +        break;
> +    case 'G':
> +        console_inc_guest_loglvl();
> +        break;
> +    case 'g':
> +        console_dec_guest_loglvl();
> +        break;
> +    }
> +}
> +
>  static void do_debug_key(unsigned char key, struct cpu_user_regs *regs)
>  {
>      (void)debugger_trap_fatal(0xf001, regs);
> @@ -290,6 +309,15 @@ void initialize_keytable(void)
>      register_keyhandler(
>          'P', perfc_reset,    "reset performance counters");
>  #endif
> +
> +    register_keyhandler(
> +        '+', change_loglvl, "increase xen console log level");
> +    register_keyhandler(
> +        '-', change_loglvl, "decrease xen console log level");
> +    register_keyhandler(
> +        'G', change_loglvl, "increase xen guest log level");
> +    register_keyhandler(
> +        'g', change_loglvl, "decrease xen guest log level");
>  
>      register_irq_keyhandler('%', do_debug_key,   "Trap to xendbg");
>  }
> diff -r 7efb3a06c56a xen/drivers/char/console.c
> --- a/xen/drivers/char/console.c Tue Feb 06 15:20:26 2007 -0700
> +++ b/xen/drivers/char/console.c Tue Feb 06 22:06:24 2007 -0700
> @@ -102,7 +102,8 @@ custom_param("loglvl", parse_loglvl);
>  custom_param("loglvl", parse_loglvl);
>  custom_param("guest_loglvl", parse_guest_loglvl);
>  
> -static atomic_t print_everything = ATOMIC_INIT(1);
> +static atomic_t print_everything = ATOMIC_INIT(0);
> +static int ratelimit_active;
>  
>  #define ___parse_loglvl(s, ps, lvlstr, lvlnum)          \
>      if ( !strncmp((s), (lvlstr), strlen(lvlstr)) ) {    \
> @@ -151,6 +152,58 @@ static char *loglvl_str(int lvl)
>      case 4: return "All";
>      }
>      return "???";
> +}
> +
> +void console_inc_loglvl(void)
> +{
> +    int loglvl;
> +
> +    do {
> +        loglvl = xenlog_lower_thresh;
> +        if (loglvl >= 4)
> +            break;
> +    } while (cmpxchg(&xenlog_lower_thresh, loglvl, loglvl + 1) != loglvl);
> +
> +    printk("Xen Loglevel: %s\n", loglvl_str(xenlog_lower_thresh));
> +}
> +
> +void console_dec_loglvl(void)
> +{
> +    int loglvl;
> +
> +    do {
> +        loglvl = xenlog_lower_thresh;
> +        if (loglvl <= 0)
> +            break;
> +    } while (cmpxchg(&xenlog_lower_thresh, loglvl, loglvl - 1) != loglvl);
> +
> +    printk("Xen Loglevel: %s\n", loglvl_str(xenlog_lower_thresh));
> +}
> +
> +void console_inc_guest_loglvl(void)
> +{
> +    int loglvl;
> +
> +    do {
> +        loglvl = xenlog_guest_lower_thresh;
> +        if (loglvl >= 4)
> +            break;
> +    } while (cmpxchg(&xenlog_guest_lower_thresh, loglvl, loglvl + 1) !=
> loglvl);
> +
> +    printk("Xen Guest Loglevel: %s\n",
> loglvl_str(xenlog_guest_lower_thresh));
> +}
> +
> +void console_dec_guest_loglvl(void)
> +{
> +    int loglvl;
> +
> +    do {
> +        loglvl = xenlog_guest_lower_thresh;
> +        if (loglvl <= 0)
> +            break;
> +    } while (cmpxchg(&xenlog_guest_lower_thresh, loglvl, loglvl - 1) !=
> loglvl);
> +
> +    printk("Xen Guest Loglevel: %s\n",
> loglvl_str(xenlog_guest_lower_thresh));
>  }
>  
>  /*
> @@ -422,9 +475,9 @@ static int printk_prefix_check(char *p,
>  
>      *pp = p;
>  
> -    return ((atomic_read(&print_everything) != 0) ||
> -            (loglvl < lower_thresh) ||
> -            ((loglvl < upper_thresh) && printk_ratelimit()));
> +    return (atomic_read(&print_everything) != 0 ||
> +            loglvl < lower_thresh ||
> +            (loglvl < upper_thresh && printk_ratelimit()));
>  } 
>  
>  void printk(const char *fmt, ...)
> @@ -570,8 +623,8 @@ void console_endboot(void)
>      /* Serial input is directed to DOM0 by default. */
>      switch_serial_input();
>  
> -    /* Now we implement the logging thresholds. */
> -    console_end_log_everything();
> +    /* Now we implement the rate limit */
> +    ratelimit_active = 1;
>  }
>  
>  void console_start_log_everything(void)
> @@ -676,6 +729,9 @@ int printk_ratelimit_burst = 10;
>  
>  int printk_ratelimit(void)
>  {
> +    if (!ratelimit_active)
> +     return 1;
> +
>      return __printk_ratelimit(printk_ratelimit_ms, printk_ratelimit_burst);
>  }
>  
> diff -r 7efb3a06c56a xen/include/xen/console.h
> --- a/xen/include/xen/console.h Tue Feb 06 15:20:26 2007 -0700
> +++ b/xen/include/xen/console.h Tue Feb 06 20:32:30 2007 -0700
> @@ -29,6 +29,11 @@ void console_start_log_everything(void);
>  void console_start_log_everything(void);
>  void console_end_log_everything(void);
>  
> +void console_inc_loglvl(void);
> +void console_dec_loglvl(void);
> +void console_inc_guest_loglvl(void);
> +void console_dec_guest_loglvl(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-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



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


 


Rackspace

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