From: Huang, Tao Date: Tue, 2 Jun 2015 11:09:35 +0000 (+0800) Subject: add support show process information on printks X-Git-Tag: firefly_0821_release~4081 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ceaeb4796f73c5d8f180b5cf942e62448ea7209f;p=firefly-linux-kernel-4.4.55.git add support show process information on printks Signed-off-by: Huang, Tao --- diff --git a/kernel/printk.c b/kernel/printk.c index 7d9dc9ad97f6..7c36e3eb7a54 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -212,6 +212,12 @@ struct log { u8 facility; /* syslog facility */ u8 flags:5; /* internal record flags */ u8 level:3; /* syslog level */ +#ifdef CONFIG_PRINTK_PROCESS + char process[16]; /* process name */ + pid_t pid; /* process id */ + u8 cpu; /* cpu id */ + u8 in_interrupt; /* interrupt context */ +#endif }; /* @@ -245,7 +251,11 @@ static enum log_flags console_prev; static u64 clear_seq; static u32 clear_idx; +#ifdef CONFIG_PRINTK_PROCESS +#define PREFIX_MAX 48 +#else #define PREFIX_MAX 32 +#endif #define LOG_LINE_MAX 1024 - PREFIX_MAX /* record buffer */ @@ -306,6 +316,25 @@ static u32 log_next(u32 idx) return idx + msg->len; } +#ifdef CONFIG_PRINTK_PROCESS +static bool printk_process = 1; +static size_t print_process(const struct log *msg, char *buf) +{ + if (!printk_process) + return 0; + + if (!buf) + return snprintf(NULL, 0, "%c[%1d:%15s:%5d] ", ' ', 0, " ", 0); + + return sprintf(buf, "%c[%1d:%15s:%5d] ", + msg->in_interrupt ? 'I' : ' ', + msg->cpu, + msg->process, + msg->pid); +} +module_param_named(process, printk_process, bool, S_IRUGO | S_IWUSR); +#endif + #ifdef CONFIG_RK_LAST_LOG extern void rk_last_log_text(char *text, size_t size); static char rk_text[1024]; @@ -368,6 +397,16 @@ static void log_store(int facility, int level, memset(log_dict(msg) + dict_len, 0, pad_len); msg->len = sizeof(struct log) + text_len + dict_len + pad_len; +#ifdef CONFIG_PRINTK_PROCESS + if (printk_process) { + strncpy(msg->process, current->comm, sizeof(msg->process)-1); + msg->process[sizeof(msg->process) - 1] = '\0'; + msg->pid = task_pid_nr(current); + msg->cpu = smp_processor_id(); + msg->in_interrupt = in_interrupt() ? 1 : 0; + } +#endif + #ifdef CONFIG_RK_LAST_LOG size = msg_print_text(msg, msg->flags, true, rk_text, sizeof(rk_text)); rk_last_log_text(rk_text, size); @@ -918,6 +957,9 @@ static size_t print_prefix(const struct log *msg, bool syslog, char *buf) } len += print_time(msg->ts_nsec, buf ? buf + len : NULL); +#ifdef CONFIG_PRINTK_PROCESS + len += print_process(msg, buf ? buf + len : NULL); +#endif return len; } @@ -1486,6 +1528,10 @@ static size_t cont_print_text(char *text, size_t size) if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) { textlen += print_time(cont.ts_nsec, text); +#ifdef CONFIG_PRINTK_PROCESS + *(text+textlen) = ' '; + textlen += print_process(NULL, NULL); +#endif size -= textlen; } diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index d317c1ad62ab..d3c6363076ef 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -14,6 +14,13 @@ config PRINTK_TIME The behavior is also controlled by the kernel command line parameter printk.time=1. See Documentation/kernel-parameters.txt +config PRINTK_PROCESS + bool "Show process information on printks" + depends on PRINTK + help + Selecting this option causes process to be + included in printk output. Or add printk.process=1 at boot-time. + config DEFAULT_MESSAGE_LOGLEVEL int "Default message log level (1-7)" range 1 7