Messages in this thread | | | Date | Tue, 25 Jan 2022 13:42:03 +0100 | From | Petr Mladek <> | Subject | Re: [PATCH 2/4] printk: disable optimistic spin during panic |
| |
On Fri 2022-01-21 11:02:20, Stephen Brennan wrote: > A CPU executing with console lock spinning enabled might be halted > during a panic. Before the panicking CPU calls console_flush_on_panic(), > it may call console_trylock(), which attempts to optimistically spin, > deadlocking the panic CPU: > > CPU 0 (panic CPU) CPU 1 > ----------------- ------ > printk() { > vprintk_func() { > vprintk_default() { > vprintk_emit() { > console_unlock() { > console_lock_spinning_enable(); > ... printing to console ... > panic() { > crash_smp_send_stop() { > NMI -------------------> HALT > } > atomic_notifier_call_chain() { > printk() { > ... > console_trylock_spinnning() { > // optimistic spin infinitely > > This hang during panic can be induced when a kdump kernel is loaded, and > crash_kexec_post_notifiers=1 is present on the kernel command line. The > following script which concurrently writes to /dev/kmsg, and triggers a > panic, can result in this hang: > > #!/bin/bash > date > # 991 chars (based on log buffer size): > chars="$(printf 'a%.0s' {1..991})" > while :; do > echo $chars > /dev/kmsg > done & > echo c > /proc/sysrq-trigger & > date > exit > > To avoid this deadlock, ensure that console_trylock_spinning() does not > allow spinning once a panic has begun. > > Fixes: dbdda842fe96 ("printk: Add console owner and waiter logic to load balance console writes") > > Suggested-by: Petr Mladek <pmladek@suse.com> > Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>
Looks good to me:
Reviewed-by: Petr Mladek <pmladek@suse.com>
Best Regards, Petr
| |