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
};
/*
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 */
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];
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);
}
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;
}
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;
}