vfio-pci: Fixes for qemu 1.4 & stable
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQ7cBkAAoJECObm247sIsi87cQAKYrlEhGRd6sIh0Yxq0Knhjf e2Kl2dzW6AH95Xzjm5P1ESXS/7rB7Gn6cN6YZqPa09S8+h5778/ZR1rznb6k4rI0 Wh/zA5uR+b3vAuMLwV5POX5/K7sPwH2iDc8EhC4lTVtkQg1nQazoWTjgISrl1W21 4fp7+H1nRmywnHseI0GXLWu1/8cXY/Bjc89vPDPhukRfaxldoBWOB/0jfk/MKfSh GwOQ71qV9hH/smHd1Ur/V9n7sxx8QNqw8y7gI5bLc9f7GRSdq1qVO9Ef9FpVeyx3 YopLFlrVYHMHmxHoWT1WAuK4av0gfLsr8cmd7dDnETooCyWVpnw8TH2/Ob6aA7Zg bxSaIwlsQwyht68wxAXs25Ev78qaIVZc8u5lDeQH/xg+QGDx7tJzgWmX8KZ4CtIG SYXnvb0T7PsCcT0kiK60ZfmCLnqXk9Aesy28kynK++dF4LitKEgNQcSru6FaaLFh yBEJKddOCItmn20e+/tMTOHefqKR+XTQyi32dDuJMteZ2sdQY9Y0Xh8wZz6y07Xq 65/3kVoAF7+c40n/zUgoZGpV31i4Y1YPzJO9Iln1ebXfvVC1+qZHkgnZFPxi0IIk kAR/9oPwffdsa3SMr84Gi552+LLoqJQNFuiBuWyZ3jAI+s8LZCgVhZQ/1e2ycXV4 jwlkmZcVAqbXO65fNyo7 =CHTk -----END PGP SIGNATURE----- Merge remote-tracking branch 'awilliam/tags/qemu-1.4-vfio-20130109.0' into staging vfio-pci: Fixes for qemu 1.4 & stable * awilliam/tags/qemu-1.4-vfio-20130109.0: vfio-pci: Loosen sanity checks to allow future features vfio-pci: Make host MSI-X enable track guest Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
commit
8757c09f15
@ -562,8 +562,8 @@ static int vfio_enable_vectors(VFIODevice *vdev, bool msix)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int vfio_msix_vector_use(PCIDevice *pdev,
|
||||
unsigned int nr, MSIMessage msg)
|
||||
static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
|
||||
MSIMessage *msg, IOHandler *handler)
|
||||
{
|
||||
VFIODevice *vdev = DO_UPCAST(VFIODevice, pdev, pdev);
|
||||
VFIOMSIVector *vector;
|
||||
@ -587,7 +587,7 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
|
||||
* Attempt to enable route through KVM irqchip,
|
||||
* default to userspace handling if unavailable.
|
||||
*/
|
||||
vector->virq = kvm_irqchip_add_msi_route(kvm_state, msg);
|
||||
vector->virq = msg ? kvm_irqchip_add_msi_route(kvm_state, *msg) : -1;
|
||||
if (vector->virq < 0 ||
|
||||
kvm_irqchip_add_irqfd_notifier(kvm_state, &vector->interrupt,
|
||||
vector->virq) < 0) {
|
||||
@ -596,7 +596,7 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
|
||||
vector->virq = -1;
|
||||
}
|
||||
qemu_set_fd_handler(event_notifier_get_fd(&vector->interrupt),
|
||||
vfio_msi_interrupt, NULL, vector);
|
||||
handler, NULL, vector);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -639,6 +639,12 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vfio_msix_vector_use(PCIDevice *pdev,
|
||||
unsigned int nr, MSIMessage msg)
|
||||
{
|
||||
return vfio_msix_vector_do_use(pdev, nr, &msg, vfio_msi_interrupt);
|
||||
}
|
||||
|
||||
static void vfio_msix_vector_release(PCIDevice *pdev, unsigned int nr)
|
||||
{
|
||||
VFIODevice *vdev = DO_UPCAST(VFIODevice, pdev, pdev);
|
||||
@ -697,6 +703,22 @@ static void vfio_enable_msix(VFIODevice *vdev)
|
||||
|
||||
vdev->interrupt = VFIO_INT_MSIX;
|
||||
|
||||
/*
|
||||
* Some communication channels between VF & PF or PF & fw rely on the
|
||||
* physical state of the device and expect that enabling MSI-X from the
|
||||
* guest enables the same on the host. When our guest is Linux, the
|
||||
* guest driver call to pci_enable_msix() sets the enabling bit in the
|
||||
* MSI-X capability, but leaves the vector table masked. We therefore
|
||||
* can't rely on a vector_use callback (from request_irq() in the guest)
|
||||
* to switch the physical device into MSI-X mode because that may come a
|
||||
* long time after pci_enable_msix(). This code enables vector 0 with
|
||||
* triggering to userspace, then immediately release the vector, leaving
|
||||
* the physical device with no vectors enabled, but MSI-X enabled, just
|
||||
* like the guest view.
|
||||
*/
|
||||
vfio_msix_vector_do_use(&vdev->pdev, 0, NULL, NULL);
|
||||
vfio_msix_vector_release(&vdev->pdev, 0);
|
||||
|
||||
if (msix_set_vector_notifiers(&vdev->pdev, vfio_msix_vector_use,
|
||||
vfio_msix_vector_release, NULL)) {
|
||||
error_report("vfio: msix_set_vector_notifiers failed\n");
|
||||
@ -1815,13 +1837,13 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
|
||||
error_report("Warning, device %s does not support reset\n", name);
|
||||
}
|
||||
|
||||
if (dev_info.num_regions != VFIO_PCI_NUM_REGIONS) {
|
||||
if (dev_info.num_regions < VFIO_PCI_CONFIG_REGION_INDEX + 1) {
|
||||
error_report("vfio: unexpected number of io regions %u\n",
|
||||
dev_info.num_regions);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (dev_info.num_irqs != VFIO_PCI_NUM_IRQS) {
|
||||
if (dev_info.num_irqs < VFIO_PCI_MSIX_IRQ_INDEX + 1) {
|
||||
error_report("vfio: unexpected number of irqs %u\n", dev_info.num_irqs);
|
||||
goto error;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user