aboutsummaryrefslogtreecommitdiff
path: root/kernel/printk
diff options
context:
space:
mode:
authorGravatar Will Deacon <will.deacon@arm.com> 2014-06-04 16:11:45 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org> 2014-06-04 16:54:17 -0700
commit84b5ec8a9df86f3dcaaaf912715db35e4852d1da (patch)
tree1843d72b20376e3ea2c8c44bd1ab242c4a386b19 /kernel/printk
parentDocumentation: expand/clarify debug documentation (diff)
downloadlinux-84b5ec8a9df86f3dcaaaf912715db35e4852d1da.tar.gz
linux-84b5ec8a9df86f3dcaaaf912715db35e4852d1da.tar.bz2
linux-84b5ec8a9df86f3dcaaaf912715db35e4852d1da.zip
printk: report dropping of messages from logbuf
If the log ring buffer becomes full, we silently overwrite old messages with new data. console_unlock will detect this case and fast-forward the console_* pointers to skip over the corrupted data, but nothing will be reported to the user. This patch hijacks the first valid log message after detecting that we dropped messages and prefixes it with a note detailing how many messages were dropped. For long (~1000 char) messages, this will result in some truncation of the real message, but given that we're dropping things anyway, that doesn't seem to be the end of the world. Signed-off-by: Will Deacon <will.deacon@arm.com> Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Kay Sievers <kay@vrfy.org> Cc: Jan Kara <jack@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/printk')
-rw-r--r--kernel/printk/printk.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 35d9db251903..923c5d4e4202 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2157,10 +2157,15 @@ again:
}
if (console_seq < log_first_seq) {
+ len = sprintf(text, "** %u printk messages dropped ** ",
+ (unsigned)(log_first_seq - console_seq));
+
/* messages are gone, move to first one */
console_seq = log_first_seq;
console_idx = log_first_idx;
console_prev = 0;
+ } else {
+ len = 0;
}
skip:
if (console_seq == log_next_seq)
@@ -2185,8 +2190,8 @@ skip:
}
level = msg->level;
- len = msg_print_text(msg, console_prev, false,
- text, sizeof(text));
+ len += msg_print_text(msg, console_prev, false,
+ text + len, sizeof(text) - len);
console_idx = log_next(console_idx);
console_seq++;
console_prev = msg->flags;