Skip to content
  • 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
    possible:
    
    CPU0				CPU1
    console_unlock()
    
      for (;;)
         /* calling console for last message */
    
    				printk()
    				  log_store()
    				    log_next_seq++;
    
         /* see new message */
         if (seen_seq != log_next_seq) {
    	wake_klogd = true;
    	seen_seq = log_next_seq;
         }
    
         console_lock_spinning_enable();
    
    				  if (console_trylock_spinning())
    				     /* spinning */
    
         if (console_lock_spinning_disable_and_check()) {
    	printk_safe_exit_irqrestore(flags);
    	return;
    
    				  console_unlock()
    				    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>
    16c9a316