• A
    arm64: Fix deadlock scenario with smp_send_stop() · b9acc49e
    Arun KS 提交于
    If one process calls sys_reboot and that process then stops other
    CPUs while those CPUs are within a spin_lock() region we can
    potentially encounter a deadlock scenario like below.
    
    CPU 0                   CPU 1
    -----                   -----
                            spin_lock(my_lock)
    smp_send_stop()
     <send IPI>             handle_IPI()
                             disable_preemption/irqs
                              while(1);
     <PREEMPT>
    spin_lock(my_lock) <--- Waits forever
    
    We shouldn't attempt to run any other tasks after we send a stop
    IPI to a CPU so disable preemption so that this task runs to
    completion. We use local_irq_disable() here for cross-arch
    consistency with x86.
    Based-on-work-by: NStephen Boyd <sboyd@codeaurora.org>
    Signed-off-by: NArun KS <getarunks@gmail.com>
    Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
    b9acc49e
process.c 9.2 KB