lkml.org 
[lkml]   [2014]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.11 076/208] kexec: migrate to reboot cpu
    Date
    3.11.10.3 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Vivek Goyal <vgoyal@redhat.com>

    commit c97102ba96324da330078ad8619ba4dfe840dbe3 upstream.

    Commit 1b3a5d02ee07 ("reboot: move arch/x86 reboot= handling to generic
    kernel") moved reboot= handling to generic code. In the process it also
    removed the code in native_machine_shutdown() which are moving reboot
    process to reboot_cpu/cpu0.

    I guess that thought must have been that all reboot paths are calling
    migrate_to_reboot_cpu(), so we don't need this special handling. But
    kexec reboot path (kernel_kexec()) is not calling
    migrate_to_reboot_cpu() so above change broke kexec. Now reboot can
    happen on non-boot cpu and when INIT is sent in second kerneo to bring
    up BP, it brings down the machine.

    So start calling migrate_to_reboot_cpu() in kexec reboot path to avoid
    this problem.

    Bisected by WANG Chao.

    Reported-by: Matthew Whitehead <mwhitehe@redhat.com>
    Reported-by: Dave Young <dyoung@redhat.com>
    Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
    Tested-by: Baoquan He <bhe@redhat.com>
    Tested-by: WANG Chao <chaowang@redhat.com>
    Acked-by: H. Peter Anvin <hpa@linux.intel.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    include/linux/reboot.h | 1 +
    kernel/kexec.c | 1 +
    kernel/reboot.c | 2 +-
    3 files changed, 3 insertions(+), 1 deletion(-)

    diff --git a/include/linux/reboot.h b/include/linux/reboot.h
    index 8e00f9f..9e7db9e 100644
    --- a/include/linux/reboot.h
    +++ b/include/linux/reboot.h
    @@ -43,6 +43,7 @@ extern int unregister_reboot_notifier(struct notifier_block *);
    * Architecture-specific implementations of sys_reboot commands.
    */

    +extern void migrate_to_reboot_cpu(void);
    extern void machine_restart(char *cmd);
    extern void machine_halt(void);
    extern void machine_power_off(void);
    diff --git a/kernel/kexec.c b/kernel/kexec.c
    index 1f8d938..57cc094 100644
    --- a/kernel/kexec.c
    +++ b/kernel/kexec.c
    @@ -1683,6 +1683,7 @@ int kernel_kexec(void)
    {
    kexec_in_progress = true;
    kernel_restart_prepare(NULL);
    + migrate_to_reboot_cpu();
    printk(KERN_EMERG "Starting new kernel\n");
    machine_shutdown();
    }
    diff --git a/kernel/reboot.c b/kernel/reboot.c
    index f813b34..662c83f 100644
    --- a/kernel/reboot.c
    +++ b/kernel/reboot.c
    @@ -104,7 +104,7 @@ int unregister_reboot_notifier(struct notifier_block *nb)
    }
    EXPORT_SYMBOL(unregister_reboot_notifier);

    -static void migrate_to_reboot_cpu(void)
    +void migrate_to_reboot_cpu(void)
    {
    /* The boot cpu is always logical cpu 0 */
    int cpu = reboot_cpu;
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2014-01-13 20:41    [W:4.173 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site