Messages in this thread |  | | From | Sergey Senozhatsky <> | | Subject | [RFC][PATCHv2 0/7] printk: use alt_printk to handle printk() recursive calls | | Date | Sat, 1 Oct 2016 00:17:51 +0900 |
| |
Hello,
RFC
This patch set extends a lock-less NMI per-cpu buffers idea to handle recursive printk() calls. The basic mechanism is pretty much the same -- at the beginning of a deadlock-prone section we switch to lock-less printk callback, and return back to a default printk implementation at the end; the messages are getting flushed to a logbuf buffer from a safer context.
Deadlock scenarios that alt_printk can handle:
a) printk recursion from logbuf_lock spin_lock section in printk() printk() raw_spin_lock(&logbuf_lock); WARN_ON(1); raw_spin_unlock(&logbuf_lock);
b) printk from sem->lock spin_lock section printk() console_trylock() down_trylock() raw_spin_lock_irqsave(&sem->lock, flags); WARN_ON(1); raw_spin_unlock_irqrestore(&sem->lock, flags);
c) printk from logbuf_lock spin_lock section in console_unlock() printk() console_unlock() raw_spin_lock(&logbuf_lock); WARN_ON(1); raw_spin_unlock(&logbuf_lock);
d) printk from ->pi_lock from semaphore up printk() console_unlock() up() try_to_wake_up() raw_spin_lock_irqsave(&p->pi_lock, flags); WARN_ON(1); raw_spin_unlock_irqrestore(&p->pi_lock, flags);
[[against next-20160929]]
v2: -- fix build error on !NMI configs, reported by Fengguang -- reworked the series based on Petr's feedback -- added a new patch to drop zap_locks()
Sergey Senozhatsky (7): printk: use vprintk_func in vprintk() printk: rename nmi.c and exported api printk: introduce per-cpu alt_print seq buffer printk: make alt_printk available when config printk set printk: use alternative printk buffers printk: report printk recursion from alt_printk flush printk: remove zap_locks() function
include/linux/printk.h | 21 +++- init/Kconfig | 16 +-- init/main.c | 2 +- kernel/kexec_core.c | 2 +- kernel/panic.c | 4 +- kernel/printk/Makefile | 2 +- kernel/printk/{nmi.c => alt_printk.c} | 207 +++++++++++++++++++++++++--------- kernel/printk/internal.h | 44 ++++---- kernel/printk/printk.c | 92 +++------------ lib/nmi_backtrace.c | 2 +- 10 files changed, 220 insertions(+), 172 deletions(-) rename kernel/printk/{nmi.c => alt_printk.c} (58%)
-- 2.10.0.372.g6fe1b14
|  |