Message ID | 1458554926-7844-8-git-send-email-caoj.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 21 Mar 2016 18:08:43 +0800 Cao jin <caoj.fnst@cn.fujitsu.com> wrote: > From: Chen Fan <chen.fan.fnst@cn.fujitsu.com> > > because we make the vfio functions are combined > in the same way as on the host for aer, so we can > do the aer check when the function 0 was hotplugged. Suggestion: PCI hotplug requires that function 0 is added last to close the slot. Since we require that the VM bus contains the same set of devices as the host bus to support AER, we can perform an AER validation test whenever a function 0 in the VM is hot-added. > > Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com> > --- > hw/vfio/pci.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index dce3b6d..9902c87 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2030,6 +2030,35 @@ out: > return; > } > > +static void vfio_bus_check_aer_functions(PCIDevice *pdev, Error **errp) > +{ > + VFIOPCIDevice *vdev; > + PCIDevice *dev; > + Error *local_err = NULL; > + int devfn; > + > + for (devfn = 0; devfn < 8; devfn++) { ARI question again. Perhaps always use 0-255? > + dev = pci_find_device(pdev->bus, pci_bus_num(pdev->bus), > + PCI_DEVFN(PCI_SLOT(pdev->devfn), devfn)); > + if (!dev) { > + continue; > + } > + if (!object_dynamic_cast(OBJECT(dev), "vfio-pci")) { > + continue; > + } > + vdev = DO_UPCAST(VFIOPCIDevice, pdev, dev); > + if (vdev->features & VFIO_FEATURE_ENABLE_AER) { > + vfio_check_hot_bus_reset(vdev, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + } > + } > + > + return; > +} > + > static void vfio_aer_check_host_bus_reset(Error **errp) > { > VFIOGroup *group; > @@ -2982,6 +3011,22 @@ static int vfio_initfn(PCIDevice *pdev) > } > } > > + /* > + * If this function is func 0, indicate the closure of the slot. > + * we get the chance to check aer-enabled devices whether support > + * hot bus reset. > + */ > + if (DEVICE(pdev)->hotplugged && > + pdev == pci_get_function_0(pdev)) { > + Error *local_err = NULL; > + > + vfio_bus_check_aer_functions(pdev, &local_err); > + if (local_err) { > + error_report_err(local_err); > + goto out_teardown; > + } > + } > + > vfio_register_err_notifier(vdev); > vfio_register_req_notifier(vdev); > vfio_setup_resetfn_quirk(vdev);
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index dce3b6d..9902c87 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -2030,6 +2030,35 @@ out: return; } +static void vfio_bus_check_aer_functions(PCIDevice *pdev, Error **errp) +{ + VFIOPCIDevice *vdev; + PCIDevice *dev; + Error *local_err = NULL; + int devfn; + + for (devfn = 0; devfn < 8; devfn++) { + dev = pci_find_device(pdev->bus, pci_bus_num(pdev->bus), + PCI_DEVFN(PCI_SLOT(pdev->devfn), devfn)); + if (!dev) { + continue; + } + if (!object_dynamic_cast(OBJECT(dev), "vfio-pci")) { + continue; + } + vdev = DO_UPCAST(VFIOPCIDevice, pdev, dev); + if (vdev->features & VFIO_FEATURE_ENABLE_AER) { + vfio_check_hot_bus_reset(vdev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + } + } + + return; +} + static void vfio_aer_check_host_bus_reset(Error **errp) { VFIOGroup *group; @@ -2982,6 +3011,22 @@ static int vfio_initfn(PCIDevice *pdev) } } + /* + * If this function is func 0, indicate the closure of the slot. + * we get the chance to check aer-enabled devices whether support + * hot bus reset. + */ + if (DEVICE(pdev)->hotplugged && + pdev == pci_get_function_0(pdev)) { + Error *local_err = NULL; + + vfio_bus_check_aer_functions(pdev, &local_err); + if (local_err) { + error_report_err(local_err); + goto out_teardown; + } + } + vfio_register_err_notifier(vdev); vfio_register_req_notifier(vdev); vfio_setup_resetfn_quirk(vdev);