lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 235/252] Drivers: hv: vmbus: Allow cleanup of VMBUS_CONNECT_CPU if disconnected
    Date
    From: Chris Co <chrco@microsoft.com>

    commit 92e4dc8b05663d6539b1b8375f3b1cf7b204cfe9 upstream.

    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: 8a857c55420f29 ("Drivers: hv: vmbus: Always handle the VMBus messages on CPU0")
    Signed-off-by: Chris Co <chrco@microsoft.com>
    Reviewed-by: Andrea Parri (Microsoft) <parri.andrea@gmail.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20201110190118.15596-1-chrco@linux.microsoft.com
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/hv/hv.c | 8 ++++++--
    1 file changed, 6 insertions(+), 2 deletions(-)

    --- a/drivers/hv/hv.c
    +++ b/drivers/hv/hv.c
    @@ -244,9 +244,13 @@ int hv_synic_cleanup(unsigned int cpu)

    /*
    * Hyper-V does not provide a way to change the connect CPU once
    - * it is set; we must prevent the connect CPU from going offline.
    + * it is set; we must prevent the connect CPU from going offline
    + * while the VM is running normally. But in the panic or kexec()
    + * path where the vmbus is already disconnected, the CPU must be
    + * allowed to shut down.
    */
    - if (cpu == VMBUS_CONNECT_CPU)
    + if (cpu == VMBUS_CONNECT_CPU &&
    + vmbus_connection.conn_state == CONNECTED)
    return -EBUSY;

    /*

    \
     
     \ /
      Last update: 2020-11-23 14:09    [W:8.373 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site