• Chris Co's avatar
    Drivers: hv: vmbus: Allow cleanup of VMBUS_CONNECT_CPU if disconnected · 92e4dc8b
    Chris Co authored
    When invoking kexec() on a Linux guest running on a Hyper-V host, the
    kernel panics.
    
        RIP: 0010:cpuhp_issue_call+0x137/0x140
        Call Trace:
        __cpuhp_remove_state_cpuslocked+0x99/0x100
        __cpuhp_remove_state+0x1c/0x30
        hv_kexec_handler+0x23/0x30 [hv_vmbus]
        hv_machine_shutdown+0x1e/0x30
        machine_shutdown+0x10/0x20
        kernel_kexec+0x6d/0x96
        __do_sys_reboot+0x1ef/0x230
        __x64_sys_reboot+0x1d/0x20
        do_syscall_64+0x6b/0x3d8
        entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    This was due to hv_synic_cleanup() callback returning -EBUSY to
    cpuhp_issue_call() when tearing down the VMBUS_CONNECT_CPU, even
    if the vmbus_connection.conn_state = DISCONNECTED. hv_synic_cleanup()
    should succeed in the case where vmbus_connection.conn_state
    is DISCONNECTED.
    
    Fix is to add an extra condition to test for
    vmbus_connection.conn_state == CONNECTED on the VMBUS_CONNECT_CPU and
    only return early if true. This way the kexec() path can still shut
    everything down while preserving the initial behavior of preventing
    CPU offlining on the VMBUS_CONNECT_CPU while the VM is running.
    
    Fixes: 8a857c55 ("Drivers: hv: vmbus: Always handle the VMBus messages on CPU0")
    Signed-off-by: default avatarChris Co <chrco@microsoft.com>
    Reviewed-by: default avatarAndrea Parri (Microsoft) <parri.andrea@gmail.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20201110190118.15596-1-chrco@linux.microsoft.comSigned-off-by: default avatarWei Liu <wei.liu@kernel.org>
    92e4dc8b
hv.c 7.13 KB