lkml.org 
[lkml]   [2019]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 012/170] ARM: 8808/1: kexec:offline panic_smp_self_stop CPU
    Date
    From: Yufen Wang <wangyufen@huawei.com>

    [ Upstream commit 82c08c3e7f171aa7f579b231d0abbc1d62e91974 ]

    In case panic() and panic() called at the same time on different CPUS.
    For example:
    CPU 0:
    panic()
    __crash_kexec
    machine_crash_shutdown
    crash_smp_send_stop
    machine_kexec
    BUG_ON(num_online_cpus() > 1);

    CPU 1:
    panic()
    local_irq_disable
    panic_smp_self_stop

    If CPU 1 calls panic_smp_self_stop() before crash_smp_send_stop(), kdump
    fails. CPU1 can't receive the ipi irq, CPU1 will be always online.
    To fix this problem, this patch split out the panic_smp_self_stop()
    and add set_cpu_online(smp_processor_id(), false).

    Signed-off-by: Yufen Wang <wangyufen@huawei.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/kernel/smp.c | 15 +++++++++++++++
    1 file changed, 15 insertions(+)

    diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
    index e61af0600133..5e31c62127a0 100644
    --- a/arch/arm/kernel/smp.c
    +++ b/arch/arm/kernel/smp.c
    @@ -691,6 +691,21 @@ void smp_send_stop(void)
    pr_warn("SMP: failed to stop secondary CPUs\n");
    }

    +/* In case panic() and panic() called at the same time on CPU1 and CPU2,
    + * and CPU 1 calls panic_smp_self_stop() before crash_smp_send_stop()
    + * CPU1 can't receive the ipi irqs from CPU2, CPU1 will be always online,
    + * kdump fails. So split out the panic_smp_self_stop() and add
    + * set_cpu_online(smp_processor_id(), false).
    + */
    +void panic_smp_self_stop(void)
    +{
    + pr_debug("CPU %u will stop doing anything useful since another CPU has paniced\n",
    + smp_processor_id());
    + set_cpu_online(smp_processor_id(), false);
    + while (1)
    + cpu_relax();
    +}
    +
    /*
    * not supported here
    */
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-01-28 18:08    [W:4.162 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site