From: Martin Schwidefsky From: Michael Holzheu Introduce a new family of printk macros which prefixes each kmsg message with a component name and allows to tag the message with a 24 bit hash of the message text. The kmsg component name is defined per source file with the KMSG_COMPONENT macro. In order to use the kmsg_xxx macros KMSG_COMPONENT has to be defined. If the message hash will be printed to the console / syslog at all depends on CONFIG_MSG_IDS. If it is "n" then a kmsg_xxx call is just another printk wrapper. These macros are intended to be used uniformly in the s390 architecture and the s390 device drivers. Signed-off-by: Michael Holzheu Signed-off-by: Martin Schwidefsky --- arch/s390/Kconfig | 9 +++++++++ include/linux/kmsg.h | 42 ++++++++++++++++++++++++++++++++++++++++++ kernel/printk.c | 24 ++++++++++++++++++++++++ 3 files changed, 75 insertions(+) Index: kmsg-2.6/arch/s390/Kconfig =================================================================== --- kmsg-2.6.orig/arch/s390/Kconfig +++ kmsg-2.6/arch/s390/Kconfig @@ -571,6 +571,15 @@ bool "s390 guest support (EXPERIMENTAL)" select VIRTIO_CONSOLE help Select this option if you want to run the kernel under s390 linux + +config KMSG_IDS + bool "Kernel message numbers" + default y + help + Select this option if you want to include a message number to the + prefix for kernel messages issued by the s390 architecture and + driver code. See "Documentation/s390/kmsg.txt" for more details. + endmenu source "net/Kconfig" Index: kmsg-2.6/include/linux/kmsg.h =================================================================== --- /dev/null +++ kmsg-2.6/include/linux/kmsg.h @@ -0,0 +1,42 @@ +#ifndef _LINUX_KMSG_H +#define _LINUX_KMSG_H + +#define kmsg_printk(level, format, ...) \ + printk(level KMSG_COMPONENT ": " format, ##__VA_ARGS__) + +#if defined(__KMSG_CHECKER) +/* generate magic string for scripts/kmsg-doc to parse */ +#define kmsg_printk_hash(level, format, ...) \ + __KMSG_PRINT(level _FMT_ format _ARGS_ ##__VA_ARGS__ _END_) +#elif defined(CONFIG_KMSG_IDS) +int printk_hash(const char *, const char *, ...); +#define kmsg_printk_hash(level, format, ...) \ + printk_hash(level KMSG_COMPONENT ".%06x" ": ", format, ##__VA_ARGS__) +#else /* !defined(CONFIG_KMSG_IDS) */ +#define kmsg_printk_hash kmsg_printk +#endif + +#define kmsg_emerg(fmt, ...) \ + kmsg_printk_hash(KERN_EMERG, fmt, ##__VA_ARGS__) +#define kmsg_alert(fmt, ...) \ + kmsg_printk_hash(KERN_ALERT, fmt, ##__VA_ARGS__) +#define kmsg_crit(fmt, ...) \ + kmsg_printk_hash(KERN_CRIT, fmt, ##__VA_ARGS__) +#define kmsg_err(fmt, ...) \ + kmsg_printk_hash(KERN_ERR, fmt, ##__VA_ARGS__) +#define kmsg_warn(fmt, ...) \ + kmsg_printk_hash(KERN_WARNING, fmt, ##__VA_ARGS__) +#define kmsg_notice(fmt, ...) \ + kmsg_printk_hash(KERN_NOTICE, fmt, ##__VA_ARGS__) +#define kmsg_info(fmt, ...) \ + kmsg_printk_hash(KERN_INFO, fmt, ##__VA_ARGS__) + +#ifdef DEBUG +#define kmsg_dbg(fmt, ...) \ + kmsg_printk(KERN_DEBUG, fmt, ##__VA_ARGS__) +#else +#define kmsg_dbg(fmt, ...) \ + ({ if (0) kmsg_printk(KERN_DEBUG, fmt, ##__VA_ARGS__); 0; }) +#endif + +#endif /* _LINUX_KMSG_H */ Index: kmsg-2.6/kernel/printk.c =================================================================== --- kmsg-2.6.orig/kernel/printk.c +++ kmsg-2.6/kernel/printk.c @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include @@ -1343,3 +1345,25 @@ bool printk_timed_ratelimit(unsigned lon } EXPORT_SYMBOL(printk_timed_ratelimit); #endif + +#if defined CONFIG_PRINTK && defined CONFIG_KMSG_IDS + +/** + * printk_hash - print a kernel message include a hash over the message + * @prefix: message prefix including the ".%06x" for the hash + * @fmt: format string + */ +asmlinkage int printk_hash(const char *prefix, const char *fmt, ...) +{ + va_list args; + int r; + + r = printk(prefix, jhash(fmt, strlen(fmt), 0) & 0xffffff); + va_start(args, fmt); + r += vprintk(fmt, args); + va_end(args); + + return r; +} +EXPORT_SYMBOL(printk_hash); +#endif -- blue skies, Martin. "Reality continues to ruin my life." - Calvin. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/