Patch "printk: Wake klogd when passing console_lock owner" has been added to the 4.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    printk: Wake klogd when passing console_lock owner

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     printk-wake-klogd-when-passing-console_lock-owner.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit adcc7accbc8d54cd9ba446a87e44b85e7c5cfa06
Author: Petr Mladek <pmladek@xxxxxxxx>
Date:   Mon Feb 26 15:44:20 2018 +0100

    printk: Wake klogd when passing console_lock owner
    
    [ Upstream commit c14376de3a1befa70d9811ca2872d47367b48767 ]
    
    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 dbdda842fe96f8932 ("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: dbdda842fe96f8932 ("printk: Add console owner and waiter logic to load balance console writes")
    Link: http://lkml.kernel.org/r/20180226155734.dzwg3aovqnwtvkoy@xxxxxxxxxxxxxxx
    Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
    Cc: linux-kernel@xxxxxxxxxxxxxxx
    Cc: Tejun Heo <tj@xxxxxxxxxx>
    Suggested-by: Sergey Senozhatsky <sergey.senozhatsky@xxxxxxxxx>
    Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@xxxxxxxxx>
    Signed-off-by: Petr Mladek <pmladek@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 2f654a79f80b..2e2c86dd226f 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2393,7 +2393,7 @@ void console_unlock(void)
 
 		if (console_lock_spinning_disable_and_check()) {
 			printk_safe_exit_irqrestore(flags);
-			return;
+			goto out;
 		}
 
 		printk_safe_exit_irqrestore(flags);
@@ -2426,6 +2426,7 @@ void console_unlock(void)
 	if (retry && console_trylock())
 		goto again;
 
+out:
 	if (wake_klogd)
 		wake_up_klogd();
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux