From: Andrea Parri (Microsoft) <parri.andrea@xxxxxxxxx> Sent: Sunday, April 5, 2020 5:15 PM > > 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: Michael Kelley <mikelley@xxxxxxxxxxxxx> > Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@xxxxxxxxx> > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@xxxxxxx> > Cc: Andrew Murray <amurray@xxxxxxxxxxxxxxxxxxxx> > Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > Cc: <linux-pci@xxxxxxxxxxxxxxx> > --- > drivers/pci/controller/pci-hyperv.c | 44 ++++++++++++++++++----------- > 1 file changed, 28 insertions(+), 16 deletions(-) > Reviewed-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>