mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
printk: refactor processing of line severity tokens
Restructure the logic of vprintk() so the processing of the leading 3 characters of each input line is in one place, regardless whether printk_time is enabled. This makes the code smaller and easier to understand. size reduction in kernel/printk.o: text data bss dec hex filename 6157 397 1049804 1056358 101e66 printk.o.before 6117 397 1049804 1056318 101e3e printk.o.after and some style uncleanlinesses removed as well as a side-effect: Before: total: 19 errors, 22 warnings, 1340 lines checked After: total: 17 errors, 22 warnings, 1333 lines checked Signed-off-by: Nick Andrew <nick@nick-andrew.net> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
cd3a1b8562
commit
ac60ad7413
@ -655,13 +655,13 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu)
|
|||||||
static const char recursion_bug_msg [] =
|
static const char recursion_bug_msg [] =
|
||||||
KERN_CRIT "BUG: recent printk recursion!\n";
|
KERN_CRIT "BUG: recent printk recursion!\n";
|
||||||
static int recursion_bug;
|
static int recursion_bug;
|
||||||
static int log_level_unknown = 1;
|
static int new_text_line = 1;
|
||||||
static char printk_buf[1024];
|
static char printk_buf[1024];
|
||||||
|
|
||||||
asmlinkage int vprintk(const char *fmt, va_list args)
|
asmlinkage int vprintk(const char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
int printed_len = 0;
|
int printed_len = 0;
|
||||||
|
unsigned long flags;
|
||||||
int this_cpu;
|
int this_cpu;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
@ -703,61 +703,54 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
|||||||
printed_len += vscnprintf(printk_buf + printed_len,
|
printed_len += vscnprintf(printk_buf + printed_len,
|
||||||
sizeof(printk_buf) - printed_len, fmt, args);
|
sizeof(printk_buf) - printed_len, fmt, args);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy the output into log_buf. If the caller didn't provide
|
* Copy the output into log_buf. If the caller didn't provide
|
||||||
* appropriate log level tags, we insert them here
|
* appropriate log level tags, we insert them here
|
||||||
*/
|
*/
|
||||||
for (p = printk_buf; *p; p++) {
|
for (p = printk_buf; *p; p++) {
|
||||||
if (log_level_unknown) {
|
if (new_text_line) {
|
||||||
/* log_level_unknown signals the start of a new line */
|
int current_log_level = default_message_loglevel;
|
||||||
|
/* If a token, set current_log_level and skip over */
|
||||||
|
if (p[0] == '<' && p[1] >= '0' && p[1] <= '7' &&
|
||||||
|
p[2] == '>') {
|
||||||
|
current_log_level = p[1] - '0';
|
||||||
|
p += 3;
|
||||||
|
printed_len -= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Always output the token */
|
||||||
|
emit_log_char('<');
|
||||||
|
emit_log_char(current_log_level + '0');
|
||||||
|
emit_log_char('>');
|
||||||
|
printed_len += 3;
|
||||||
|
new_text_line = 0;
|
||||||
|
|
||||||
if (printk_time) {
|
if (printk_time) {
|
||||||
int loglev_char;
|
/* Follow the token with the time */
|
||||||
char tbuf[50], *tp;
|
char tbuf[50], *tp;
|
||||||
unsigned tlen;
|
unsigned tlen;
|
||||||
unsigned long long t;
|
unsigned long long t;
|
||||||
unsigned long nanosec_rem;
|
unsigned long nanosec_rem;
|
||||||
|
|
||||||
/*
|
|
||||||
* force the log level token to be
|
|
||||||
* before the time output.
|
|
||||||
*/
|
|
||||||
if (p[0] == '<' && p[1] >='0' &&
|
|
||||||
p[1] <= '7' && p[2] == '>') {
|
|
||||||
loglev_char = p[1];
|
|
||||||
p += 3;
|
|
||||||
printed_len -= 3;
|
|
||||||
} else {
|
|
||||||
loglev_char = default_message_loglevel
|
|
||||||
+ '0';
|
|
||||||
}
|
|
||||||
t = cpu_clock(printk_cpu);
|
t = cpu_clock(printk_cpu);
|
||||||
nanosec_rem = do_div(t, 1000000000);
|
nanosec_rem = do_div(t, 1000000000);
|
||||||
tlen = sprintf(tbuf,
|
tlen = sprintf(tbuf, "[%5lu.%06lu] ",
|
||||||
"<%c>[%5lu.%06lu] ",
|
|
||||||
loglev_char,
|
|
||||||
(unsigned long) t,
|
(unsigned long) t,
|
||||||
nanosec_rem / 1000);
|
nanosec_rem / 1000);
|
||||||
|
|
||||||
for (tp = tbuf; tp < tbuf + tlen; tp++)
|
for (tp = tbuf; tp < tbuf + tlen; tp++)
|
||||||
emit_log_char(*tp);
|
emit_log_char(*tp);
|
||||||
printed_len += tlen;
|
printed_len += tlen;
|
||||||
} else {
|
|
||||||
if (p[0] != '<' || p[1] < '0' ||
|
|
||||||
p[1] > '7' || p[2] != '>') {
|
|
||||||
emit_log_char('<');
|
|
||||||
emit_log_char(default_message_loglevel
|
|
||||||
+ '0');
|
|
||||||
emit_log_char('>');
|
|
||||||
printed_len += 3;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
log_level_unknown = 0;
|
|
||||||
if (!*p)
|
if (!*p)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_log_char(*p);
|
emit_log_char(*p);
|
||||||
if (*p == '\n')
|
if (*p == '\n')
|
||||||
log_level_unknown = 1;
|
new_text_line = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user