[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEN] Implement log levels. It adds the thresholds and code to printk
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxxx # Node ID fd8036d06e10b0830305a43962087b7c50317723 # Parent e834d5b965d025e110f84d29512eab4703b86278 [XEN] Implement log levels. It adds the thresholds and code to printk to implement the thresholds. Signed-off-by: Steven Rostedt <srostedt@xxxxxxxxxx> --- xen/drivers/char/console.c | 41 +++++++++++++++ xen/include/xen/config.h | 119 ++++++++++++++++++++++++++++++++++++++++----- xen/include/xen/lib.h | 4 + 3 files changed, 151 insertions(+), 13 deletions(-) diff -r e834d5b965d0 -r fd8036d06e10 xen/drivers/char/console.c --- a/xen/drivers/char/console.c Fri Oct 27 18:46:20 2006 +0100 +++ b/xen/drivers/char/console.c Fri Oct 27 18:52:55 2006 +0100 @@ -57,6 +57,13 @@ static int sercon_handle = -1; static int sercon_handle = -1; static DEFINE_SPINLOCK(console_lock); + +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 xen_startup = 1; /* * ******************************************************** @@ -307,6 +314,10 @@ void printk(const char *fmt, ...) va_list args; char *p, *q; unsigned long flags; + int level = XENLOG_DEFAULT; + int upper_thresh = xenlog_upper_thresh; + int lower_thresh = xenlog_lower_thresh; + int print_regardless = xen_startup; spin_lock_irqsave(&console_lock, flags); @@ -315,6 +326,32 @@ void printk(const char *fmt, ...) va_end(args); p = buf; + + /* Is this print caused by a guest? */ + if ( strncmp("<G>", p, 3) == 0 ) + { + upper_thresh = xenlog_guest_upper_thresh; + lower_thresh = xenlog_guest_lower_thresh; + level = XENLOG_GUEST_DEFAULT; + p += 3; + } + + if ( (p[0] == '<') && + (p[1] >= '0') && (p[1] <= ('0' + XENLOG_MAX)) && + (p[2] == '>') ) + { + level = p[1] - '0'; + p += 3; + } + + 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'; @@ -334,6 +371,7 @@ void printk(const char *fmt, ...) start_of_line = 0; } + out: spin_unlock_irqrestore(&console_lock, flags); } @@ -419,6 +457,9 @@ void console_endboot(void) /* Serial input is directed to DOM0 by default. */ switch_serial_input(); + + /* Now we implement the logging thresholds. */ + xen_startup = 0; } void console_force_unlock(void) diff -r e834d5b965d0 -r fd8036d06e10 xen/include/xen/config.h --- a/xen/include/xen/config.h Fri Oct 27 18:46:20 2006 +0100 +++ b/xen/include/xen/config.h Fri Oct 27 18:52:55 2006 +0100 @@ -12,26 +12,119 @@ #define EXPORT_SYMBOL(var) #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -/* Linux syslog levels. */ -#define KERN_NOTICE "" -#define KERN_WARNING "" -#define KERN_DEBUG "" -#define KERN_INFO "" -#define KERN_ERR "" -#define KERN_CRIT "" -#define KERN_EMERG "" -#define KERN_ALERT "" +/* + * The following log levels are as follows: + * + * XENLOG_ERR: Fatal errors, either Xen, Guest or Dom0 + * is about to crash. + * + * XENLOG_WARNING: Something bad happened, but we can recover. + * + * XENLOG_INFO: Interesting stuff, but not too noisy. + * + * XENLOG_DEBUG: Use where ever you like. Lots of noise. + * + * + * Since we don't trust the guest operating system, we don't want + * it to allow for DoS by causing the HV to print out a lot of + * info, so where ever the guest has control of what is printed + * we use the XENLOG_GUEST to distinguish that the output is + * controled by the Guest. + * + * To make it easier on the typing, the above log levels all + * have a corresponding _G_ equivalent that appends the + * XENLOG_GUEST. (see the defines below). + * + */ +#define XENLOG_ERR "<0>" +#define XENLOG_WARNING "<1>" +#define XENLOG_INFO "<2>" +#define XENLOG_DEBUG "<3>" + +#define XENLOG_GUEST "<G>" + +#define XENLOG_G_ERR XENLOG_GUEST XENLOG_ERR +#define XENLOG_G_WARNING XENLOG_GUEST XENLOG_WARNING +#define XENLOG_G_INFO XENLOG_GUEST XENLOG_INFO +#define XENLOG_G_DEBUG XENLOG_GUEST XENLOG_DEBUG + +#define XENLOG_MAX 3 + +/* + * To control the amount of printing, thresholds are added. + * These thresholds correspond to the above log levels. + * There's an upper and lower threshold for non-guests + * and Guest. This works as follows: + * + * If printk log level > upper threshold + * don't print anything + * + * If printk log level >= lower threshold + * rate limit the print (keep the amount down) + * + * Otherwise, just print. + * + * Note, in the above algorithm, to never rate limit + * simply make the lower threshold greater than the upper. + * This way the output will never be rate limited. + * + * For example: + * lower = 2; upper = 1; + * This will always print ERR and WARNING messages + * but will not print anything else. Nothing is + * rate limited. + */ +/* + * Defaults: + * For the HV, always print ERR and WARNING + * but nothing for INFO and DEBUG. + * + * For Guests, always rate limit ERR and WARNING + * but never print for INFO and DEBUG. + */ +#ifndef XENLOG_UPPER_THRESHOLD +#define XENLOG_UPPER_THRESHOLD 1 +#endif +#ifndef XENLOG_LOWER_THRESHOLD +#define XENLOG_LOWER_THRESHOLD 2 +#endif +#ifndef XENLOG_GUEST_UPPER_THRESHOLD +#define XENLOG_GUEST_UPPER_THRESHOLD 1 +#endif +#ifndef XENLOG_GUEST_LOWER_THRESHOLD +#define XENLOG_GUEST_LOWER_THRESHOLD 0 +#endif + +/* + * The XENLOG_DEFAULT is the default given to printks that + * do not have any print level associated to it. + */ +#ifndef XENLOG_DEFAULT +#define XENLOG_DEFAULT 1 /* Warning */ +#endif +#ifndef XENLOG_GUEST_DEFAULT +#define XENLOG_GUEST_DEFAULT 1 /* Warning */ +#endif + +/* + * Some code is copied directly from Linux. + * Match some of the Linux log levels to Xen. + * (Should these be Guest logs?? - SDR) + */ +#define KERN_ERR XENLOG_ERR +#define KERN_CRIT XENLOG_ERR +#define KERN_EMERG XENLOG_ERR +#define KERN_WARNING XENLOG_WARNING +#define KERN_NOTICE XENLOG_INFO +#define KERN_INFO XENLOG_INFO +#define KERN_DEBUG XENLOG_DEBUG /* Linux 'checker' project. */ #define __iomem #define __user -#ifdef VERBOSE #define DPRINTK(_f, _a...) printk("(file=%s, line=%d) " _f, \ __FILE__ , __LINE__ , ## _a ) -#else -#define DPRINTK(_f, _a...) ((void)0) -#endif #ifndef __ASSEMBLY__ #include <xen/compiler.h> diff -r e834d5b965d0 -r fd8036d06e10 xen/include/xen/lib.h --- a/xen/include/xen/lib.h Fri Oct 27 18:46:20 2006 +0100 +++ b/xen/include/xen/lib.h Fri Oct 27 18:52:55 2006 +0100 @@ -58,6 +58,10 @@ 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 |