On (09/11/18 10:47), Petr Mladek wrote: > > Oh, that was intentional. I consider repeated messages to be less > > problematic than the missing ones. > > It makes some sense. But it might be problematic with slow consoles.
Right. And this is why I brought up Jan's patch. And I agree that we better discuss that approach in a separate thread. > > > Most problems should probably be solved when we store console_seq > > > before setting exclusive_console. Then we could clear > > > exclusive_console when reaching the stored sequence number. > > > > > > Can this be that simple? ;-) > > > > This can work, yes. > > I'll try to cook up a patch later this week. Hmm, wouldn't the same "it might be problematic with slow consoles" argument apply to this solution as well? If we flush_on_panic(), and have a slow exclusive_console then flushing logbuf to that slow exclusive_console can take quite some time, before we even begin to flush oops messages. So maybe we can do the following: - store console_seq when we register exclusive console - in flush_on_panic, if we have exclusive console set - clear exclusive console - rollback console_seq to the value it had before we set exclusive console So we will not re-flush all logbuf messages, but only the new ones and should get to oops messages sooner. IOW, something like this? --- diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 53c94cbce0af..4ef199572df7 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -424,6 +424,7 @@ static u32 log_next_idx; /* the next printk record to write to the console */ static u64 console_seq; static u32 console_idx; +static u64 rollback_console_seq; /* the next printk record to read after the last 'clear' command */ static u64 clear_seq; @@ -2592,6 +2593,10 @@ void console_flush_on_panic(void) */ console_trylock(); console_may_schedule = 0; + if (exclusive_console) { + exclusive_console = NULL; + console_seq = rollback_console_seq; + } console_unlock(); } @@ -2793,6 +2798,7 @@ void register_console(struct console *newcon) * for us. */ logbuf_lock_irqsave(flags); + rollback_console_seq = console_seq; console_seq = syslog_seq; console_idx = syslog_idx; logbuf_unlock_irqrestore(flags); --- -ss