• Seiji Aguchi's avatar
    efi_pstore: Avoid deadlock in non-blocking paths · e59310ad
    Seiji Aguchi authored
    [Issue]
    
    There is a scenario which efi_pstore may hang up:
    
     - cpuA grabs efivars->lock
     - cpuB panics and calls smp_send_stop
     - smp_send_stop sends IRQ to cpuA
     - after 1 second, cpuB gives up on cpuA and sends an NMI instead
     - cpuA is now in an NMI handler while still holding efivars->lock
     - cpuB is deadlocked
    
    This case may happen if a firmware has a bug and
    cpuA is stuck talking with it.
    
    [Solution]
    
    This patch changes a spin_lock to a spin_trylock in non-blocking paths.
    and if the spin_lock has already taken by another cpu,
    it returns without accessing to a firmware to avoid the deadlock.
    Signed-off-by: default avatarSeiji Aguchi <seiji.aguchi@hds.com>
    Acked-by: default avatarDon Zickus <dzickus@redhat.com>
    Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
    e59310ad
efivars.c 45.4 KB