• Petr Mladek's avatar
    printk: Wake klogd when passing console_lock owner · 16c9a316
    Petr Mladek authored
    [ Upstream commit c14376de ]
    wake_klogd is a local variable in console_unlock(). The information
    is lost when the console_lock owner using the busy wait added by
    the commit dbdda842 ("printk: Add console owner and waiter
    logic to load balance console writes"). The following race is
    CPU0				CPU1
      for (;;)
         /* calling console for last message */
         /* see new message */
         if (seen_seq != log_next_seq) {
    	wake_klogd = true;
    	seen_seq = log_next_seq;
    				  if (console_trylock_spinning())
    				     /* spinning */
         if (console_lock_spinning_disable_and_check()) {
    				    if (seen_seq != log_next_seq) {
    				    /* already seen */
    				    /* nothing to do */
    Result: Nobody would wakeup klogd.
    One solution would be to make a global variable from wake_klogd.
    But then we would need to manipulate it under a lock or so.
    This patch wakes klogd also when console_lock is passed to the
    spinning waiter. It looks like the right way to go. Also userspace
    should have a chance to see and store any "flood" of messages.
    Note that the very late klogd wake up was a historic solution.
    It made sense on single CPU systems or when sys_syslog() operations
    were synchronized using the big kernel lock like in v2.1.113.
    But it is questionable these days.
    Fixes: dbdda842 ("printk: Add console owner and waiter logic to load balance console writes")
    Link: http://lkml.kernel.org/r/20180226155734.dzwg3aovqnwtvkoy@pathway.suse.cz
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: linux-kernel@vger.kernel.org
    Cc: Tejun Heo <tj@kernel.org>
    Suggested-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reviewed-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
printk.c 83.7 KB