• Michael Holzheu's avatar
    kdump: fix crash_kexec()/smp_send_stop() race in panic() · 93e13a36
    Michael Holzheu authored
    When two CPUs call panic at the same time there is a possible race
    condition that can stop kdump.  The first CPU calls crash_kexec() and the
    second CPU calls smp_send_stop() in panic() before crash_kexec() finished
    on the first CPU.  So the second CPU stops the first CPU and therefore
    kdump fails:
    
    1st CPU:
      panic()->crash_kexec()->mutex_trylock(&kexec_mutex)-> do kdump
    
    2nd CPU:
      panic()->crash_kexec()->kexec_mutex already held by 1st CPU
           ->smp_send_stop()-> stop 1st CPU (stop kdump)
    
    This patch fixes the problem by introducing a spinlock in panic that
    allows only one CPU to process crash_kexec() and the subsequent panic
    code.
    
    All other CPUs call the weak function panic_smp_self_stop() that stops the
    CPU itself.  This function can be overloaded by architecture code.  For
    example "tile" can use their lower-power "nap" instruction for that.
    Signed-off-by: default avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
    Acked-by: default avatarChris Metcalf <cmetcalf@tilera.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    93e13a36
panic.c 10.7 KB