Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

printk: flush conflicting continuation line

An earlier newline was missing and current print is from different task.
In this scenario flush the continuation line and store this line
seperatly.

This patch fix the below scenario of timestamp interleaving,
[ 28.154370 ] read_word_reg : reg[0x 3], reg[0x 4] data [0x 642]
[ 28.155428 ] uart disconnect
[ 31.947341 ] dvfs[cpufreq.c<275>]:plug-in cpu<1> done
[ 28.155445 ] UART detached : send switch state 201
[ 32.014112 ] read_reg : reg[0x 3] data[0x21]

[akpm@linux-foundation.org: simplify and condense the code]
Signed-off-by: Arun KS <getarunks@gmail.com>
Signed-off-by: Arun KS <arun.ks@broadcom.com>
Cc: Joe Perches <joe@perches.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Kay Sievers <kay@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Arun KS and committed by
Linus Torvalds
1d3fa370 aaf07621

+6 -3
+6 -3
kernel/printk/printk.c
··· 1595 1595 * either merge it with the current buffer and flush, or if 1596 1596 * there was a race with interrupts (prefix == true) then just 1597 1597 * flush it out and store this line separately. 1598 + * If the preceding printk was from a different task and missed 1599 + * a newline, flush and append the newline. 1598 1600 */ 1599 - if (cont.len && cont.owner == current) { 1600 - if (!(lflags & LOG_PREFIX)) 1601 - stored = cont_add(facility, level, text, text_len); 1601 + if (cont.len) { 1602 + if (cont.owner == current && !(lflags & LOG_PREFIX)) 1603 + stored = cont_add(facility, level, text, 1604 + text_len); 1602 1605 cont_flush(LOG_NEWLINE); 1603 1606 } 1604 1607