• Sebastian Andrzej Siewior's avatar
    lib/vsprintf: Initialize vsprintf's pointer hash once the random core is ready. · 6f0ac3b5
    Sebastian Andrzej Siewior authored
    The printk code invokes vnsprintf in order to compute the complete
    string before adding it into its buffer. This happens in an IRQ-off
    region which leads to a warning on PREEMPT_RT in the random code if the
    format strings contains a %p for pointer printing. This happens because
    the random core acquires locks which become sleeping locks on PREEMPT_RT
    which must not be acquired with disabled interrupts and or preemption
    disabled.
    By default the pointers are hashed which requires a random value on the
    first invocation (either by printk or another user which comes first.
    
    One could argue that there is no need for printk to disable interrupts
    during the vsprintf() invocation which would fix the just mentioned
    problem. However printk itself can be invoked in a context with
    disabled interrupts which would lead to the very same problem.
    
    Move the initialization of ptr_key into a worker and schedule it from
    subsys_initcall(). This happens early but after the workqueue subsystem
    is ready. Use get_random_bytes() to retrieve the random value if the RNG
    core is ready, otherwise schedule a worker in two seconds and try again.
    
    Another advantage is that it removes a lock from the vsprintf() code path.
    It prevents a possible deadlock when printk("%p", ptr) is called under
    the lock taken in get_random_bytes().
    Reported-by: default avatarMike Galbraith <efault@gmx.de>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Acked-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    [pmladek@suse.com: Added a note about the it prevented a possible deadlock in printk().]
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20220927104912.622645-3-bigeasy@linutronix.de
    6f0ac3b5
vsprintf.c 86.9 KB