On 22/09/15 13:45, Jan Beulich wrote: > ... so that one doesn't always need to reboot to see more / fewer > messages. > > Note that upper thresholds are sticky, i.e. while they get adjusted > upwards when the lower threshold would otherwise end up above the upper > one, they don't get adjusted when reducing the lower one. > > Signed-off-by: Jan Beulich > --- > TBD: Should we also add a (more flexible) sysctl? That would be nicer than using `xl debug-keys +++++; xl dmesg` > > --- a/xen/drivers/char/console.c > +++ b/xen/drivers/char/console.c > @@ -168,7 +168,7 @@ static void __init parse_guest_loglvl(ch > _parse_loglvl(s, &xenlog_guest_lower_thresh, &xenlog_guest_upper_thresh); > } > > -static char * __init loglvl_str(int lvl) > +static char *loglvl_str(int lvl) > { > switch ( lvl ) > { > @@ -181,6 +181,66 @@ static char * __init loglvl_str(int lvl) > return "???"; > } > > +static int *__read_mostly upper_thresh_adj = &xenlog_upper_thresh; > +static int *__read_mostly lower_thresh_adj = &xenlog_lower_thresh; > +static const char *__read_mostly thresh_adj = "standard"; > + > +static void do_toggle_guest(unsigned char key, struct cpu_user_regs *regs) > +{ > + if ( upper_thresh_adj == &xenlog_upper_thresh ) > + { > + upper_thresh_adj = &xenlog_guest_upper_thresh; > + lower_thresh_adj = &xenlog_guest_lower_thresh; > + thresh_adj = "guest"; > + } > + else > + { > + upper_thresh_adj = &xenlog_upper_thresh; > + lower_thresh_adj = &xenlog_lower_thresh; > + thresh_adj = "standard"; > + } > + printk("'%c' pressed -> %s log level adjustments enabled\n", > + key, thresh_adj); > +} > + > +static void do_adj_thresh(unsigned char key) > +{ > + if ( *upper_thresh_adj < *lower_thresh_adj ) > + *upper_thresh_adj = *lower_thresh_adj; > + printk("'%c' pressed -> %s log level: %s (rate limited %s)\n", > + key, thresh_adj, loglvl_str(*lower_thresh_adj), > + loglvl_str(*upper_thresh_adj)); It might be useful for this printk() to indicate whether it was the standard or the guest log level which was adjusted. > +} > + > +static void do_inc_thresh(unsigned char key, struct cpu_user_regs *regs) > +{ > + ++*lower_thresh_adj; > + do_adj_thresh(key); > +} > + > +static void do_dec_thresh(unsigned char key, struct cpu_user_regs *regs) > +{ > + if ( *lower_thresh_adj ) > + --*lower_thresh_adj; > + do_adj_thresh(key); > +} > + > +static struct keyhandler inc_thresh_keyhandler = { > + .irq_callback = 1, > + .u.irq_fn = do_inc_thresh, > + .desc = "increase log level threshold" > +}; > +static struct keyhandler dec_thresh_keyhandler = { > + .irq_callback = 1, > + .u.irq_fn = do_dec_thresh, > + .desc = "decrease log level threshold" > +}; > +static struct keyhandler toggle_guest_keyhandler = { > + .irq_callback = 1, > + .u.irq_fn = do_toggle_guest, > + .desc = "toggle host/guest log level adjustment" > +}; > + I am guessing from the looks of these that I should augment my keyhandler cleanup to also be able to register irq handlers from outside of common/keyhandler.c ~Andrew > /* > * ******************************************************** > * *************** ACCESS TO CONSOLE RING ***************** > @@ -834,6 +894,9 @@ void __init console_endboot(void) > xen_rx = !xen_rx; > > register_keyhandler('w', &dump_console_ring_keyhandler); > + register_keyhandler('+', &inc_thresh_keyhandler); > + register_keyhandler('-', &dec_thresh_keyhandler); > + register_keyhandler('G', &toggle_guest_keyhandler); > > /* Serial input is directed to DOM0 by default. */ > switch_serial_input(); > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel