• John Ogness's avatar
    printk: introduce console_list_lock · 4dc64682
    John Ogness authored
    Currently there exist races in register_console(), where the types
    of registered consoles are checked (without holding the console_lock)
    and then after acquiring the console_lock, it is assumed that the list
    has not changed. Also, some code that performs console_unregister()
    make similar assumptions.
    
    It might be possible to fix these races using the console_lock. But
    it would require a complex analysis of all console drivers to make
    sure that the console_lock is not taken in match() and setup()
    callbacks. And we really prefer to split up and reduce the
    responsibilities of console_lock rather than expand its complexity.
    Therefore, introduce a new console_list_lock to provide full
    synchronization for any console list changes.
    
    In addition, also use console_list_lock for synchronization of
    console->flags updates. All flags are either static or modified only
    during the console registration. There are only two exceptions.
    
    The first exception is CON_ENABLED, which is also modified by
    console_start()/console_stop(). Therefore, these functions must
    also take the console_list_lock.
    
    The second exception is when the flags are modified by the console
    driver init code before the console is registered. These will be
    ignored because they are not visible to the rest of the system
    via the console_drivers list.
    
    Note that one of the various responsibilities of the console_lock is
    also intended to provide console list and console->flags
    synchronization. Later changes will update call sites relying on the
    console_lock for these purposes. Once all call sites have been
    updated, the console_lock will be relieved of synchronizing
    console_list and console->flags updates.
    Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/87sficwokr.fsf@jogness.linutronix.de
    4dc64682
printk.c 106 KB