• Kairui Song's avatar
    x86/hyperv: Fix kernel panic when kexec on HyperV · 179fb36a
    Kairui Song authored
    After commit 68bb7bfb ("X86/Hyper-V: Enable IPI enlightenments"),
    kexec fails with a kernel panic:
    
    kexec_core: Starting new kernel
    BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
    Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS Hyper-V UEFI Release v3.0 03/02/2018
    RIP: 0010:0xffffc9000001d000
    
    Call Trace:
     ? __send_ipi_mask+0x1c6/0x2d0
     ? hv_send_ipi_mask_allbutself+0x6d/0xb0
     ? mp_save_irq+0x70/0x70
     ? __ioapic_read_entry+0x32/0x50
     ? ioapic_read_entry+0x39/0x50
     ? clear_IO_APIC_pin+0xb8/0x110
     ? native_stop_other_cpus+0x6e/0x170
     ? native_machine_shutdown+0x22/0x40
     ? kernel_kexec+0x136/0x156
    
    That happens if hypercall based IPIs are used because the hypercall page is
    reset very early upon kexec reboot, but kexec sends IPIs to stop CPUs,
    which invokes the hypercall and dereferences the unusable page.
    
    To fix his, reset hv_hypercall_pg to NULL before the page is reset to avoid
    any misuse, IPI sending will fall back to the non hypercall based
    method. This only happens on kexec / kdump so just setting the pointer to
    NULL is good enough.
    
    Fixes: 68bb7bfb ("X86/Hyper-V: Enable IPI enlightenments")
    Signed-off-by: default avatarKairui Song <kasong@redhat.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: "K. Y. Srinivasan" <kys@microsoft.com>
    Cc: Haiyang Zhang <haiyangz@microsoft.com>
    Cc: Stephen Hemminger <sthemmin@microsoft.com>
    Cc: Sasha Levin <sashal@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: devel@linuxdriverproject.org
    Link: https://lkml.kernel.org/r/20190306111827.14131-1-kasong@redhat.com
    179fb36a
hv_init.c 12.6 KB