• Hidehiro Kawai's avatar
    kexec: Fix race between panic() and crash_kexec() · 7bbee5ca
    Hidehiro Kawai authored
    Currently, panic() and crash_kexec() can be called at the same time.
    For example (x86 case):
    
    CPU 0:
      oops_end()
        crash_kexec()
          mutex_trylock() // acquired
            nmi_shootdown_cpus() // stop other CPUs
    
    CPU 1:
      panic()
        crash_kexec()
          mutex_trylock() // failed to acquire
        smp_send_stop() // stop other CPUs
        infinite loop
    
    If CPU 1 calls smp_send_stop() before nmi_shootdown_cpus(), kdump
    fails.
    
    In another case:
    
    CPU 0:
      oops_end()
        crash_kexec()
          mutex_trylock() // acquired
            <NMI>
            io_check_error()
              panic()
                crash_kexec()
                  mutex_trylock() // failed to acquire
                infinite loop
    
    Clearly, this is an undesirable result.
    
    To fix this problem, this patch changes crash_kexec() to exclude others
    by using the panic_cpu atomic.
    Signed-off-by: default avatarHidehiro Kawai <hidehiro.kawai.ez@hitachi.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: kexec@lists.infradead.org
    Cc: linux-doc@vger.kernel.org
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Minfei Huang <mnfhuang@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Seth Jennings <sjenning@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Cc: Vivek Goyal <vgoyal@redhat.com>
    Cc: x86-ml <x86@kernel.org>
    Link: http://lkml.kernel.org/r/20151210014630.25437.94161.stgit@softrsSigned-off-by: default avatarBorislav Petkov <bp@suse.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    7bbee5ca
kexec_core.c 38.8 KB