Commit 84b5ec8a authored by Will Deacon's avatar Will Deacon Committed by Linus Torvalds

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: default avatarWill Deacon <will.deacon@arm.com>
Acked-by: default avatarPeter Zijlstra <peterz@infradead.org>
Cc: Kay Sievers <kay@vrfy.org>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6e099f55
...@@ -2157,10 +2157,15 @@ void console_unlock(void) ...@@ -2157,10 +2157,15 @@ void console_unlock(void)
} }
if (console_seq < log_first_seq) { 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 */ /* messages are gone, move to first one */
console_seq = log_first_seq; console_seq = log_first_seq;
console_idx = log_first_idx; console_idx = log_first_idx;
console_prev = 0; console_prev = 0;
} else {
len = 0;
} }
skip: skip:
if (console_seq == log_next_seq) if (console_seq == log_next_seq)
...@@ -2185,8 +2190,8 @@ void console_unlock(void) ...@@ -2185,8 +2190,8 @@ void console_unlock(void)
} }
level = msg->level; level = msg->level;
len = msg_print_text(msg, console_prev, false, len += msg_print_text(msg, console_prev, false,
text, sizeof(text)); text + len, sizeof(text) - len);
console_idx = log_next(console_idx); console_idx = log_next(console_idx);
console_seq++; console_seq++;
console_prev = msg->flags; console_prev = msg->flags;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment