• Andrea Parri (Microsoft)'s avatar
    PCI: hv: Prepare hv_compose_msi_msg() for the VMBus-channel-interrupt-to-vCPU... · 240ad77c
    Andrea Parri (Microsoft) authored
    PCI: hv: Prepare hv_compose_msi_msg() for the VMBus-channel-interrupt-to-vCPU reassignment functionality
    
    The current implementation of hv_compose_msi_msg() is incompatible with
    the new functionality that allows changing the vCPU a VMBus channel will
    interrupt: if this function always calls hv_pci_onchannelcallback() in
    the polling loop, the interrupt going to a different CPU could cause
    hv_pci_onchannelcallback() to be running simultaneously in a tasklet,
    which will break.  The current code also has a problem in that it is not
    synchronized with vmbus_reset_channel_cb(): hv_compose_msi_msg() could
    be accessing the ring buffer via the call of hv_pci_onchannelcallback()
    well after the time that vmbus_reset_channel_cb() has finished.
    
    Fix these issues as follows.  Disable the channel tasklet before
    entering the polling loop in hv_compose_msi_msg() and re-enable it when
    done.  This will prevent hv_pci_onchannelcallback() from running in a
    tasklet on a different CPU.  Moreover, poll by always calling
    hv_pci_onchannelcallback(), but check the channel callback function for
    NULL and invoke the callback within a sched_lock critical section.  This
    will prevent hv_compose_msi_msg() from accessing the ring buffer after
    vmbus_reset_channel_cb() has acquired the sched_lock spinlock.
    Suggested-by: default avatarMichael Kelley <mikelley@microsoft.com>
    Signed-off-by: default avatarAndrea Parri (Microsoft) <parri.andrea@gmail.com>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Andrew Murray <amurray@thegoodpenguin.co.uk>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: <linux-pci@vger.kernel.org>
    Link: https://lore.kernel.org/r/20200406001514.19876-8-parri.andrea@gmail.comReviewed-by: default avatarMichael Kelley <mikelley@microsoft.com>
    Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
    240ad77c
pci-hyperv.c 93.7 KB