[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEN] Add 'loglvl' and 'guest_loglvl' boot parameters.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxxx # Node ID dd62270df2ad69ace6b42dd5aecba0b42c593072 # Parent 20204db0891b0b7c10959822e3283656c3600500 [XEN] Add 'loglvl' and 'guest_loglvl' boot parameters. <lvl> := none|error|warning|info|debug|all loglvl=<lvl_print_always>[/<lvl_print_ratelimit>] <lvl_print_always>: log level which is always printed <lvl_print_rlimit>: log level which is rate-limit printed 'loglvl' applies to non-guest-related messages. 'guest_loglvl' applies to guest-related messages. Defaults: loglvl=warning ; guest_loglvl=none/warning Also clean up hvm_print_line(). Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- docs/src/user.tex | 9 ++++ xen/arch/x86/domain.c | 2 xen/arch/x86/hvm/hvm.c | 28 ++++++------- xen/drivers/char/console.c | 79 +++++++++++++++++++++++++++++++++++++-- xen/include/asm-x86/hvm/domain.h | 8 +-- xen/include/xen/lib.h | 4 - 6 files changed, 104 insertions(+), 26 deletions(-) diff -r 20204db0891b -r dd62270df2ad docs/src/user.tex --- a/docs/src/user.tex Thu Nov 02 18:52:04 2006 +0000 +++ b/docs/src/user.tex Thu Nov 02 22:24:20 2006 +0000 @@ -3192,6 +3192,15 @@ editing \path{grub.conf}. input to DOM0 when it boots --- if it is `x' then auto-switching is disabled. Any other value, or omitting the character, enables auto-switching. [NB. Default switch-char is `a'.] +\item [ loglvl=$<$level$>/<$level$>$ ] + Specify logging level. Messages of the specified severity level (and + higher) will be printed to the Xen console. Valid levels are `none', + `error', `warning', `info', `debug', and `all'. The second level + specifier is optional: it is used to specify message severities + which are to be rate limited. Default is `loglvl=warning'. +\item [ guest\_loglvl=$<$level$>/<$level$>$ ] As for loglvl, but + applies to messages relating to guests. Default is + `guest\_loglvl=none/warning'. \item [ nmi=xxx ] Specify what to do with an NMI parity or I/O error. \\ `nmi=fatal': Xen prints a diagnostic and then hangs. \\ diff -r 20204db0891b -r dd62270df2ad xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Thu Nov 02 18:52:04 2006 +0000 +++ b/xen/arch/x86/domain.c Thu Nov 02 22:24:20 2006 +0000 @@ -243,6 +243,8 @@ int arch_domain_create(struct domain *d) goto fail; } + spin_lock_init(&d->arch.hvm_domain.pbuf_lock); + rc = shadow_enable(d, SHM2_refcounts|SHM2_translate|SHM2_external); if ( rc != 0 ) goto fail; diff -r 20204db0891b -r dd62270df2ad xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c Thu Nov 02 18:52:04 2006 +0000 +++ b/xen/arch/x86/hvm/hvm.c Thu Nov 02 22:24:20 2006 +0000 @@ -325,22 +325,22 @@ int hvm_copy_from_guest_virt(void *buf, return __hvm_copy(buf, shadow_gva_to_gpa(current, vaddr), size, 0); } -/* - * HVM specific printbuf. Mostly used for hvmloader chit-chat. - */ +/* HVM specific printbuf. Mostly used for hvmloader chit-chat. */ void hvm_print_line(struct vcpu *v, const char c) { - int *index = &v->domain->arch.hvm_domain.pbuf_index; - char *pbuf = v->domain->arch.hvm_domain.pbuf; - - if (*index == HVM_PBUF_SIZE-2 || c == '\n') { - if (*index == HVM_PBUF_SIZE-2) - pbuf[(*index)++] = c; - pbuf[*index] = '\0'; - printk("(GUEST: %u) %s\n", v->domain->domain_id, pbuf); - *index = 0; - } else - pbuf[(*index)++] = c; + struct hvm_domain *hd = &v->domain->arch.hvm_domain; + + spin_lock(&hd->pbuf_lock); + hd->pbuf[hd->pbuf_idx++] = c; + if ( (hd->pbuf_idx == (sizeof(hd->pbuf) - 2)) || (c == '\n') ) + { + if ( c != '\n' ) + hd->pbuf[hd->pbuf_idx++] = '\n'; + hd->pbuf[hd->pbuf_idx] = '\0'; + printk(XENLOG_G_DEBUG "HVM%u: %s\n", v->domain->domain_id, hd->pbuf); + hd->pbuf_idx = 0; + } + spin_unlock(&hd->pbuf_lock); } typedef unsigned long hvm_hypercall_t( diff -r 20204db0891b -r dd62270df2ad xen/drivers/char/console.c --- a/xen/drivers/char/console.c Thu Nov 02 18:52:04 2006 +0000 +++ b/xen/drivers/char/console.c Thu Nov 02 22:24:20 2006 +0000 @@ -82,12 +82,75 @@ static DEFINE_SPINLOCK(console_lock); #define XENLOG_DEFAULT 1 /* XENLOG_WARNING */ #define XENLOG_GUEST_DEFAULT 1 /* XENLOG_WARNING */ -int xenlog_upper_thresh = XENLOG_UPPER_THRESHOLD; -int xenlog_lower_thresh = XENLOG_LOWER_THRESHOLD; -int xenlog_guest_upper_thresh = XENLOG_GUEST_UPPER_THRESHOLD; -int xenlog_guest_lower_thresh = XENLOG_GUEST_LOWER_THRESHOLD; +static int xenlog_upper_thresh = XENLOG_UPPER_THRESHOLD; +static int xenlog_lower_thresh = XENLOG_LOWER_THRESHOLD; +static int xenlog_guest_upper_thresh = XENLOG_GUEST_UPPER_THRESHOLD; +static int xenlog_guest_lower_thresh = XENLOG_GUEST_LOWER_THRESHOLD; + +static void parse_loglvl(char *s); +static void parse_guest_loglvl(char *s); + +/* + * <lvl> := none|error|warning|info|debug|all + * loglvl=<lvl_print_always>[/<lvl_print_ratelimit>] + * <lvl_print_always>: log level which is always printed + * <lvl_print_rlimit>: log level which is rate-limit printed + * Similar definitions for guest_loglvl, but applies to guest tracing. + * Defaults: loglvl=warning ; guest_loglvl=none/warning + */ +custom_param("loglvl", parse_loglvl); +custom_param("guest_loglvl", parse_guest_loglvl); static int xen_startup = 1; + +#define ___parse_loglvl(s, ps, lvlstr, lvlnum) \ + if ( !strncmp((s), (lvlstr), strlen(lvlstr)) ) { \ + *(ps) = (s) + strlen(lvlstr); \ + return (lvlnum); \ + } + +static int __parse_loglvl(char *s, char **ps) +{ + ___parse_loglvl(s, ps, "none", 0); + ___parse_loglvl(s, ps, "error", 1); + ___parse_loglvl(s, ps, "warning", 2); + ___parse_loglvl(s, ps, "info", 3); + ___parse_loglvl(s, ps, "debug", 4); + ___parse_loglvl(s, ps, "all", 4); + return 2; /* sane fallback */ +} + +static void _parse_loglvl(char *s, int *lower, int *upper) +{ + *lower = *upper = __parse_loglvl(s, &s); + if ( *s == '/' ) + *upper = __parse_loglvl(s+1, &s); + if ( *upper < *lower ) + *upper = *lower; +} + +static void parse_loglvl(char *s) +{ + _parse_loglvl(s, &xenlog_lower_thresh, &xenlog_upper_thresh); +} + +static void parse_guest_loglvl(char *s) +{ + _parse_loglvl(s, &xenlog_guest_lower_thresh, &xenlog_guest_upper_thresh); +} + +static char *loglvl_str(int lvl) +{ + switch ( lvl ) + { + case 0: return "Nothing"; + case 1: return "Errors"; + case 2: return "Errors and warnings"; + case 3: return "Errors, warnings and info"; + case 4: return "All"; + } + return "???"; +} /* * ******************************************************** @@ -450,6 +513,14 @@ void console_endboot(void) { int i, j; + printk("Std. Loglevel: %s", loglvl_str(xenlog_lower_thresh)); + if ( xenlog_upper_thresh != xenlog_lower_thresh ) + printk(" (Rate-limited: %s)", loglvl_str(xenlog_upper_thresh)); + printk("\nGuest Loglevel: %s", loglvl_str(xenlog_guest_lower_thresh)); + if ( xenlog_guest_upper_thresh != xenlog_guest_lower_thresh ) + printk(" (Rate-limited: %s)", loglvl_str(xenlog_guest_upper_thresh)); + printk("\n"); + if ( opt_sync_console ) { printk("**********************************************\n"); diff -r 20204db0891b -r dd62270df2ad xen/include/asm-x86/hvm/domain.h --- a/xen/include/asm-x86/hvm/domain.h Thu Nov 02 18:52:04 2006 +0000 +++ b/xen/include/asm-x86/hvm/domain.h Thu Nov 02 22:24:20 2006 +0000 @@ -28,8 +28,6 @@ #include <asm/hvm/vioapic.h> #include <public/hvm/params.h> -#define HVM_PBUF_SIZE 80 - struct hvm_domain { unsigned long shared_page_va; unsigned long buffered_io_va; @@ -45,8 +43,10 @@ struct hvm_domain { spinlock_t round_robin_lock; int interrupt_request; - int pbuf_index; - char pbuf[HVM_PBUF_SIZE]; + /* hvm_print_line() logging. */ + char pbuf[80]; + int pbuf_idx; + spinlock_t pbuf_lock; uint64_t params[HVM_NR_PARAMS]; }; diff -r 20204db0891b -r dd62270df2ad xen/include/xen/lib.h --- a/xen/include/xen/lib.h Thu Nov 02 18:52:04 2006 +0000 +++ b/xen/include/xen/lib.h Thu Nov 02 22:24:20 2006 +0000 @@ -58,10 +58,6 @@ extern long vm_assist(struct domain *, u extern long vm_assist(struct domain *, unsigned int, unsigned int); extern int __printk_ratelimit(int ratelimit_ms, int ratelimit_burst); extern int printk_ratelimit(void); -extern int xenlog_upper_thresh; -extern int xenlog_lower_thresh; -extern int xenlog_guest_upper_thresh; -extern int xenlog_guest_lower_thresh; /* vsprintf.c */ extern int sprintf(char * buf, const char * fmt, ...) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |