aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/printk.c61
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)
655static const char recursion_bug_msg [] = 655static const char recursion_bug_msg [] =
656 KERN_CRIT "BUG: recent printk recursion!\n"; 656 KERN_CRIT "BUG: recent printk recursion!\n";
657static int recursion_bug; 657static int recursion_bug;
658static int log_level_unknown = 1; 658 static int new_text_line = 1;
659static char printk_buf[1024]; 659static char printk_buf[1024];
660 660
661asmlinkage int vprintk(const char *fmt, va_list args) 661asmlinkage 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 /*