diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/printk.c | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 7d5556152234..98ca1b76277f 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -655,13 +655,13 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu) | |||
| 655 | static const char recursion_bug_msg [] = | 655 | static const char recursion_bug_msg [] = |
| 656 | KERN_CRIT "BUG: recent printk recursion!\n"; | 656 | KERN_CRIT "BUG: recent printk recursion!\n"; |
| 657 | static int recursion_bug; | 657 | static int recursion_bug; |
| 658 | static int log_level_unknown = 1; | 658 | static int new_text_line = 1; |
| 659 | static char printk_buf[1024]; | 659 | static char printk_buf[1024]; |
| 660 | 660 | ||
| 661 | asmlinkage int vprintk(const char *fmt, va_list args) | 661 | asmlinkage int vprintk(const char *fmt, va_list args) |
| 662 | { | 662 | { |
| 663 | unsigned long flags; | ||
| 664 | int printed_len = 0; | 663 | int printed_len = 0; |
| 664 | unsigned long flags; | ||
| 665 | int this_cpu; | 665 | int this_cpu; |
| 666 | char *p; | 666 | char *p; |
| 667 | 667 | ||
| @@ -703,61 +703,54 @@ asmlinkage int vprintk(const char *fmt, va_list args) | |||
| 703 | printed_len += vscnprintf(printk_buf + printed_len, | 703 | printed_len += vscnprintf(printk_buf + printed_len, |
| 704 | sizeof(printk_buf) - printed_len, fmt, args); | 704 | sizeof(printk_buf) - printed_len, fmt, args); |
| 705 | 705 | ||
| 706 | |||
| 706 | /* | 707 | /* |
| 707 | * Copy the output into log_buf. If the caller didn't provide | 708 | * Copy the output into log_buf. If the caller didn't provide |
| 708 | * appropriate log level tags, we insert them here | 709 | * appropriate log level tags, we insert them here |
| 709 | */ | 710 | */ |
| 710 | for (p = printk_buf; *p; p++) { | 711 | for (p = printk_buf; *p; p++) { |
| 711 | if (log_level_unknown) { | 712 | if (new_text_line) { |
| 712 | /* log_level_unknown signals the start of a new line */ | 713 | int current_log_level = default_message_loglevel; |
| 714 | /* If a token, set current_log_level and skip over */ | ||
| 715 | if (p[0] == '<' && p[1] >= '0' && p[1] <= '7' && | ||
| 716 | p[2] == '>') { | ||
| 717 | current_log_level = p[1] - '0'; | ||
| 718 | p += 3; | ||
| 719 | printed_len -= 3; | ||
| 720 | } | ||
| 721 | |||
| 722 | /* Always output the token */ | ||
| 723 | emit_log_char('<'); | ||
| 724 | emit_log_char(current_log_level + '0'); | ||
| 725 | emit_log_char('>'); | ||
| 726 | printed_len += 3; | ||
| 727 | new_text_line = 0; | ||
| 728 | |||
| 713 | if (printk_time) { | 729 | if (printk_time) { |
| 714 | int loglev_char; | 730 | /* Follow the token with the time */ |
| 715 | char tbuf[50], *tp; | 731 | char tbuf[50], *tp; |
| 716 | unsigned tlen; | 732 | unsigned tlen; |
| 717 | unsigned long long t; | 733 | unsigned long long t; |
| 718 | unsigned long nanosec_rem; | 734 | unsigned long nanosec_rem; |
| 719 | 735 | ||
| 720 | /* | ||
| 721 | * force the log level token to be | ||
| 722 | * before the time output. | ||
| 723 | */ | ||
| 724 | if (p[0] == '<' && p[1] >='0' && | ||
| 725 | p[1] <= '7' && p[2] == '>') { | ||
| 726 | loglev_char = p[1]; | ||
| 727 | p += 3; | ||
| 728 | printed_len -= 3; | ||
| 729 | } else { | ||
| 730 | loglev_char = default_message_loglevel | ||
| 731 | + '0'; | ||
| 732 | } | ||
| 733 | t = cpu_clock(printk_cpu); | 736 | t = cpu_clock(printk_cpu); |
| 734 | nanosec_rem = do_div(t, 1000000000); | 737 | nanosec_rem = do_div(t, 1000000000); |
| 735 | tlen = sprintf(tbuf, | 738 | tlen = sprintf(tbuf, "[%5lu.%06lu] ", |
| 736 | "<%c>[%5lu.%06lu] ", | 739 | (unsigned long) t, |
| 737 | loglev_char, | 740 | nanosec_rem / 1000); |
| 738 | (unsigned long)t, | ||
| 739 | nanosec_rem/1000); | ||
| 740 | 741 | ||
| 741 | for (tp = tbuf; tp < tbuf + tlen; tp++) | 742 | for (tp = tbuf; tp < tbuf + tlen; tp++) |
| 742 | emit_log_char(*tp); | 743 | emit_log_char(*tp); |
| 743 | printed_len += tlen; | 744 | printed_len += tlen; |
| 744 | } else { | ||
| 745 | if (p[0] != '<' || p[1] < '0' || | ||
| 746 | p[1] > '7' || p[2] != '>') { | ||
| 747 | emit_log_char('<'); | ||
| 748 | emit_log_char(default_message_loglevel | ||
| 749 | + '0'); | ||
| 750 | emit_log_char('>'); | ||
| 751 | printed_len += 3; | ||
| 752 | } | ||
| 753 | } | 745 | } |
| 754 | log_level_unknown = 0; | 746 | |
| 755 | if (!*p) | 747 | if (!*p) |
| 756 | break; | 748 | break; |
| 757 | } | 749 | } |
| 750 | |||
| 758 | emit_log_char(*p); | 751 | emit_log_char(*p); |
| 759 | if (*p == '\n') | 752 | if (*p == '\n') |
| 760 | log_level_unknown = 1; | 753 | new_text_line = 1; |
| 761 | } | 754 | } |
| 762 | 755 | ||
| 763 | /* | 756 | /* |
