printk: queue wake_up_klogd irq_work only if per-CPU areas are ready
printk_deferred(), similarly to printk_safe/printk_nmi, does not immediately attempt to print a new message on the consoles, avoiding calls into non-reentrant kernel paths, e.g. scheduler or timekeeping, which potentially can deadlock the system. Those printk() flavors, instead, rely on per-CPU flush irq_work to print messages from safer contexts. For same reasons (recursive scheduler or timekeeping calls) printk() uses per-CPU irq_work in order to wake up user space syslog/kmsg readers. However, only printk_safe/printk_nmi do make sure that per-CPU areas have been initialised and that it's safe to modify per-CPU irq_work. This means that, for instance, should printk_deferred() be invoked "too early", that is before per-CPU areas are initialised, printk_deferred() will perform illegal per-CPU access. Lech Perczak [0] reports that after commit 1b710b1b ("char/random: silence a lockdep splat with printk()") user-space syslog/kmsg r...
Showing
- include/linux/printk.h 0 additions, 5 deletionsinclude/linux/printk.h
- init/main.c 0 additions, 1 deletioninit/main.c
- kernel/printk/internal.h 5 additions, 0 deletionskernel/printk/internal.h
- kernel/printk/printk.c 34 additions, 0 deletionskernel/printk/printk.c
- kernel/printk/printk_safe.c 1 addition, 10 deletionskernel/printk/printk_safe.c
Please register or sign in to comment