• Valentin Schneider's avatar
    panic, kexec: make __crash_kexec() NMI safe · 05c62574
    Valentin Schneider authored
    Attempting to get a crash dump out of a debug PREEMPT_RT kernel via an NMI
    panic() doesn't work.  The cause of that lies in the PREEMPT_RT definition
    of mutex_trylock():
    
    	if (IS_ENABLED(CONFIG_DEBUG_RT_MUTEXES) && WARN_ON_ONCE(!in_task()))
    		return 0;
    
    This prevents an nmi_panic() from executing the main body of
    __crash_kexec() which does the actual kexec into the kdump kernel.  The
    warning and return are explained by:
    
      6ce47fd9 ("rtmutex: Warn if trylock is called from hard/softirq context")
      [...]
      The reasons for this are:
    
          1) There is a potential deadlock in the slowpath
    
          2) Another cpu which blocks on the rtmutex will boost the task
    	 which allegedly locked the rtmutex, but that cannot work
    	 because the hard/softirq context borrows the task context.
    
    Furthermore, grabbing the lock isn't NMI safe, so do away with kexec_mutex
    and replace it with an atomic variable.  This is somewhat overzealous as
    *some* callsites could keep using a mutex (e.g.  the sysfs-facing ones
    like crash_shrink_memory()), but this has the benefit of involving a
    single unified lock and preventing any future NMI-related surprises.
    
    Tested by triggering NMI panics via:
    
      $ echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi
      $ echo 1 > /proc/sys/kernel/unknown_nmi_panic
      $ echo 1 > /proc/sys/kernel/panic
    
      $ ipmitool power diag
    
    Link: https://lkml.kernel.org/r/20220630223258.4144112-3-vschneid@redhat.com
    Fixes: 6ce47fd9 ("rtmutex: Warn if trylock is called from hard/softirq context")
    Signed-off-by: default avatarValentin Schneider <vschneid@redhat.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: "Eric W . Biederman" <ebiederm@xmission.com>
    Cc: Juri Lelli <jlelli@redhat.com>
    Cc: Luis Claudio R. Goncalves <lgoncalv@redhat.com>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    05c62574
kexec_core.c 31.1 KB