Since 5c2992ee7fd8a29 ("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.

Signed-off-by: Sergey Senozhatsky <sergey.senozhat...@gmail.com>
---
 kernel/printk/printk.c | 22 ++++------------------
 1 file changed, 4 insertions(+), 18 deletions(-)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 308497194bd4..e72cb793aff1 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -192,16 +192,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;
 
 /*
@@ -1806,12 +1797,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;
        }
@@ -2731,8 +2718,7 @@ void register_console(struct console *newcon)
        }
 
        if (newcon->flags & CON_EXTENDED)
-               if (!nr_ext_console_drivers++)
-                       pr_info("printk: continuation disabled due to ext 
consoles, expect more fragments in /dev/kmsg\n");
+               nr_ext_console_drivers++;
 
        if (newcon->flags & CON_PRINTBUFFER) {
                /*
-- 
2.19.0

Reply via email to