printk: keep kernel cont support always enabled
Since commit5c2992ee7f
("printk: remove console flushing special cases for partial buffered lines") we don't print cont fragments to the consoles; cont lines are now proper log_buf entries and there is no "consecutive continuation flag" anymore: we either have 'c' entries that mark continuation lines without fragments; or '-' entries that mark normal logbuf entries. There are no '+' entries anymore. However, we still have a small leftover - presence of ext_console drivers disables kernel cont support and we flush each pr_cont() and store it as a separate log_buf entry. Previously, it worked because msg_print_ext_header() had that "an optional external merge of the records" functionality: if (msg->flags & LOG_CONT) cont = (prev_flags & LOG_CONT) ? '+' : 'c'; We don't do this as of now, so keep kernel cont always enabled. Note from pmladek: The original purpose was to get full information including the metadata and dictionary via extended console drivers, see commit6fe29354be
("printk: implement support for extended console drivers"). The dictionary probably was the most important part but it was actually lost: static void cont_flush(void) { [...] log_store(cont.facility, cont.level, cont.flags, cont.ts_nsec, NULL, 0, cont.buf, cont.len); Nobody noticed because the only dictionary user is dev_printk() and dev_cont() is _not_ defined. Link: http://lkml.kernel.org/r/20181002023836.4487-2-sergey.senozhatsky@gmail.com To: Steven Rostedt <rostedt@goodmis.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Dmitriy Vyukov <dvyukov@google.com> Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> Cc: Tejun Heo <tj@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: LKML <linux-kernel@vger.kernel.org> Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com> Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> [pmladek@suse.com: Updated commit message] Signed-off-by: Petr Mladek <pmladek@suse.com>
This commit is contained in:
parent
e6fe3e5b7d
commit
9627808d2d
|
@ -194,16 +194,7 @@ int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Number of registered extended console drivers.
|
||||
*
|
||||
* If extended consoles are present, in-kernel cont reassembly is disabled
|
||||
* and each fragment is stored as a separate log entry with proper
|
||||
* continuation flag so that every emitted message has full metadata. This
|
||||
* doesn't change the result for regular consoles or /proc/kmsg. For
|
||||
* /dev/kmsg, as long as the reader concatenates messages according to
|
||||
* consecutive continuation flags, the end result should be the same too.
|
||||
*/
|
||||
/* Number of registered extended console drivers. */
|
||||
static int nr_ext_console_drivers;
|
||||
|
||||
/*
|
||||
|
@ -1781,12 +1772,8 @@ static void cont_flush(void)
|
|||
|
||||
static bool cont_add(int facility, int level, enum log_flags flags, const char *text, size_t len)
|
||||
{
|
||||
/*
|
||||
* If ext consoles are present, flush and skip in-kernel
|
||||
* continuation. See nr_ext_console_drivers definition. Also, if
|
||||
* the line gets too long, split it up in separate records.
|
||||
*/
|
||||
if (nr_ext_console_drivers || cont.len + len > sizeof(cont.buf)) {
|
||||
/* If the line gets too long, split it up in separate records. */
|
||||
if (cont.len + len > sizeof(cont.buf)) {
|
||||
cont_flush();
|
||||
return false;
|
||||
}
|
||||
|
@ -2706,8 +2693,7 @@ void register_console(struct console *newcon)
|
|||
}
|
||||
|
||||
if (newcon->flags & CON_EXTENDED)
|
||||
if (!nr_ext_console_drivers++)
|
||||
pr_info("continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n");
|
||||
nr_ext_console_drivers++;
|
||||
|
||||
if (newcon->flags & CON_PRINTBUFFER) {
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue