mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
printk: clean up handling of log-levels and newlines
It used to be that we would only look at the log-level in a printk() after explicit newlines, which can cause annoying problems when the previous printk() did not end with a '\n'. In that case, the log-level marker would be just printed out in the middle of the line, and be seen as just noise rather than change the logging level. This changes things to always look at the log-level in the first bytes of the printout. If a log level marker is found, it is always used as the log-level. Additionally, if no newline existed, one is added (unless the log-level is the explicit KERN_CONT marker, to explicitly show that it's a continuation of a previous line). Acked-by: Arjan van de Ven <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
03347e2592
commit
5fd29d6ccb
2 changed files with 23 additions and 10 deletions
|
|
@ -687,20 +687,33 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
|||
sizeof(printk_buf) - printed_len, fmt, args);
|
||||
|
||||
|
||||
p = printk_buf;
|
||||
|
||||
/* Do we have a loglevel in the string? */
|
||||
if (p[0] == '<') {
|
||||
unsigned char c = p[1];
|
||||
if (c && p[2] == '>') {
|
||||
switch (c) {
|
||||
case '0' ... '7': /* loglevel */
|
||||
current_log_level = c - '0';
|
||||
if (!new_text_line) {
|
||||
emit_log_char('\n');
|
||||
new_text_line = 1;
|
||||
}
|
||||
/* Fallthrough - skip the loglevel */
|
||||
case 'c': /* KERN_CONT */
|
||||
p += 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the output into log_buf. If the caller didn't provide
|
||||
* appropriate log level tags, we insert them here
|
||||
*/
|
||||
for (p = printk_buf; *p; p++) {
|
||||
for ( ; *p; p++) {
|
||||
if (new_text_line) {
|
||||
/* 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');
|
||||
|
|
|
|||
Loading…
Reference in a new issue