diff mbox

[v4,07/10] vfio: add check aer functionality for hotplug device

Message ID 1458554926-7844-8-git-send-email-caoj.fnst@cn.fujitsu.com
State New
Headers show

Commit Message

Cao jin March 21, 2016, 10:08 a.m. UTC
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.

Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
---
 hw/vfio/pci.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

Comments

Alex Williamson March 21, 2016, 9:40 p.m. UTC | #1
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 mbox

Patch

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);