Re: [PATCH 3/3] drivers/vfio/pci: Fix MSIx message lost

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2014-04-02 at 12:16 +1100, Alexey Kardashevskiy wrote:
> On 03/10/2014 04:46 PM, Gavin Shan wrote:
> > The problem is specific to the case of BIST reset issued to IPR
> > adapter on the guest side. The IPR driver calls pci_save_state(),
> > issues BIST reset and then pci_restore_state(). The issued BIST
> > cleans out MSIx table and pci_restore_state() doesn't restore
> > the MSIx table as expected. Eventually, MSIx messages with all
> > zeros are sent and causes EEH error on Power platform.
> > 
> > The patch fixes it by writing MSIx message to MSIx table before
> > reenabling the individual interrupts in the following path:
> > 
> > qemu/hw/pci/msix.c::msix_table_mmio_write
> >                     msix_handle_mask_update
> >                     msix_fire_vector_notifier
> > qemu/hw/misc/vfio.c::vfio_msix_vector_use
> >                     vfio_msix_vector_do_use
> > 
> > IOCTL Command VFIO_DEVICE_SET_IRQS to VFIO-PCI
> > vfio/pci/vfio_pci.c::vfio_pci_ioctl
> > vfio/pci/vfio_pci_intrs.c::vfio_pci_set_irqs_ioctl
> >                     vfio_pci_set_msi_trigger
> >                     vfio_msi_set_block
> >                     vfio_msi_set_vector_signal
> > 
> > Reported-by: Wen Xiong <wenxiong@xxxxxxxxxx>
> > Signed-off-by: Gavin Shan <shangw@xxxxxxxxxxxxxxxxxx>
> > ---
> >  drivers/vfio/pci/vfio_pci_intrs.c |   11 +++++++++++
> >  1 file changed, 11 insertions(+)
> > 
> > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
> > index 2103576..83e0638 100644
> > --- a/drivers/vfio/pci/vfio_pci_intrs.c
> > +++ b/drivers/vfio/pci/vfio_pci_intrs.c
> > @@ -17,6 +17,7 @@
> >  #include <linux/interrupt.h>
> >  #include <linux/eventfd.h>
> >  #include <linux/pci.h>
> > +#include <linux/msi.h>
> >  #include <linux/file.h>
> >  #include <linux/poll.h>
> >  #include <linux/vfio.h>
> > @@ -517,6 +518,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
> >  	struct pci_dev *pdev = vdev->pdev;
> >  	int irq = msix ? vdev->msix[vector].vector : pdev->irq + vector;
> >  	char *name = msix ? "vfio-msix" : "vfio-msi";
> > +	struct msi_msg msg;
> >  	struct eventfd_ctx *trigger;
> >  	int ret;
> >  
> > @@ -544,6 +546,15 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
> >  		return PTR_ERR(trigger);
> >  	}
> >  
> > +	/* We possiblly lose the MSI/MSIx message in some cases, one
> > +	 * of which is pci_save_state(), BIST reset and pci_restore_state()
> > +	 * for IPR adapter. The BIST reset cleans out MSIx table and we
> > +	 * don't have chance to restore it. Here, we have the trick to
> > +	 * restore it before enabling individual interrupts. For MSI messages,
> > +	 * it's harmless to write them back.
> > +	 */
> > +	get_cached_msi_msg(irq, &msg);
> > +	write_msi_msg(irq, &msg);
> >  	ret = request_irq(irq, vfio_msihandler, 0,
> >  			  vdev->ctx[vector].name, trigger);
> >  	if (ret) {
> > 
> 
> 
> This is missing to successfully compile VFIO as modules:

Yep, I noted this in my reply on 3/18.  Thanks,

Alex

> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index 2c10752..80ba2e9 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -283,6 +283,7 @@ void get_cached_msi_msg(unsigned int irq, struct
> msi_msg *msg)
> 
>         __get_cached_msi_msg(entry, msg);
>  }
> +EXPORT_SYMBOL_GPL(get_cached_msi_msg);
> 
>  void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
>  {
> @@ -327,6 +328,7 @@ void write_msi_msg(unsigned int irq, struct msi_msg *msg)
> 
>         __write_msi_msg(entry, msg);
>  }
> +EXPORT_SYMBOL_GPL(write_msi_msg);
> 
>  static void free_msi_irqs(struct pci_dev *dev)
>  {
> 
> 
> 
> 



--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux