]> xenbits.xensource.com Git - libvirt.git/commitdiff
virhostdev: Introduce and use virHostdevIsVFIODevice
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 6 Aug 2019 14:25:12 +0000 (16:25 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 21 Oct 2019 11:50:23 +0000 (13:50 +0200)
In some places we need to check if a hostdev has VFIO backend.
Because of how complicated virDomainHostdevDef structure is, the
check consists of three lines. Move them to a function and
replace all checks with the function call.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Cole Robinson <crobinso@redhat.com>
src/conf/domain_conf.c
src/libvirt_private.syms
src/qemu/qemu_cgroup.c
src/qemu/qemu_domain.c
src/qemu/qemu_hotplug.c
src/util/virhostdev.c
src/util/virhostdev.h

index afa997b381443c16f2a5e90e00822424004c08c4..080e2c91aa1bf2e4c9212bd84bfe4c153eda7b53 100644 (file)
@@ -31486,10 +31486,7 @@ virDomainDefHasVFIOHostdev(const virDomainDef *def)
     size_t i;
 
     for (i = 0; i < def->nhostdevs; i++) {
-        const virDomainHostdevDef *tmp = def->hostdevs[i];
-        if (tmp->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
-            tmp->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
-            tmp->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO)
+        if (virHostdevIsVFIODevice(def->hostdevs[i]))
             return true;
     }
 
index 15bfc711f50b42a531603f9e918e9cec75a3282a..6d4c826ff9d62e6da9f829f061fc10ee4b260352 100644 (file)
@@ -2112,6 +2112,7 @@ virHostCPUStatsAssign;
 virHostdevFindUSBDevice;
 virHostdevIsMdevDevice;
 virHostdevIsSCSIDevice;
+virHostdevIsVFIODevice;
 virHostdevManagerGetDefault;
 virHostdevPCINodeDeviceDetach;
 virHostdevPCINodeDeviceReAttach;
index e49bb8fb7ec78f9f3bbb810abe7e3562d8d4bc71..b0e1bcab767ec532e2304bc0623698f87b526bee 100644 (file)
@@ -413,9 +413,7 @@ qemuTeardownHostdevCgroup(virDomainObjPtr vm,
     if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DEVICES))
         return 0;
 
-    if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
-        dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
-        dev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO &&
+    if (virHostdevIsVFIODevice(dev) &&
         qemuDomainGetHostdevPath(vm->def, dev, true,
                                  &npaths, &path, NULL) < 0)
         goto cleanup;
index 9b201a8259977ba797e6ae752eb391bc3ed6a04b..997c35c951a9e18a43245659efabcb3b02183538 100644 (file)
@@ -11761,9 +11761,7 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def)
     for (i = 0; i < def->nhostdevs; i++) {
         virDomainHostdevDefPtr dev = def->hostdevs[i];
 
-        if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
-            dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
-            dev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
+        if (virHostdevIsVFIODevice(dev)) {
             usesVFIO = true;
 
             pciAddr = &dev->source.subsys.u.pci.addr;
@@ -11915,12 +11913,8 @@ qemuDomainGetMemLockLimitBytes(virDomainDefPtr def)
      * Note that this may not be valid for all platforms.
      */
     for (i = 0; i < def->nhostdevs; i++) {
-        virDomainHostdevSubsysPtr subsys = &def->hostdevs[i]->source.subsys;
-
-        if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
-            (subsys->type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV ||
-             (subsys->type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
-              subsys->u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO))) {
+        if (virHostdevIsVFIODevice(def->hostdevs[i]) ||
+            virHostdevIsMdevDevice(def->hostdevs[i])) {
             memKB = virDomainDefGetMemoryTotal(def) + 1024 * 1024;
             goto done;
         }
index 4da6457bdc93314e5461f9329f3957276888e61b..2d47f7461f934fbcea34de4a87f40d7a0bd8374b 100644 (file)
@@ -4437,16 +4437,10 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
     qemuDomainObjPrivatePtr priv = vm->privateData;
     g_autofree char *drivealias = NULL;
     g_autofree char *objAlias = NULL;
-    bool is_vfio = false;
 
     VIR_DEBUG("Removing host device %s from domain %p %s",
               hostdev->info->alias, vm, vm->def->name);
 
-    if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
-        int backend = hostdev->source.subsys.u.pci.backend;
-        is_vfio = backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
-    }
-
     if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
         virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
         virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
@@ -4494,7 +4488,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
 
     virDomainAuditHostdev(vm, hostdev, "detach", true);
 
-    if (!is_vfio &&
+    if (!virHostdevIsVFIODevice(hostdev) &&
         qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0)
         VIR_WARN("Failed to restore host device labelling");
 
index 475796aae5a376a57aea15ce4e84401bceca4f4f..010eb551a9112112b26af59025e946934c7ec079 100644 (file)
@@ -389,6 +389,21 @@ virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev)
 }
 
 
+/**
+ * virHostdevIsVFIODevice:
+ * @hostdev: host device to check
+ *
+ * Returns true if @hostdev is a PCI device with VFIO backend, false otherwise.
+ */
+bool
+virHostdevIsVFIODevice(const virDomainHostdevDef *hostdev)
+{
+    return hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+        hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
+        hostdev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
+}
+
+
 static int
 virHostdevNetConfigVirtPortProfile(const char *linkdev, int vf,
                                    virNetDevVPortProfilePtr virtPort,
index b8269c57bdb0ba4b3a9fd091bdd3b09baebd6923..2d61c21e9dac7435395f539969f67702d117ffbc 100644 (file)
@@ -193,6 +193,9 @@ virHostdevIsSCSIDevice(const virDomainHostdevDef *hostdev)
 bool
 virHostdevIsMdevDevice(const virDomainHostdevDef *hostdev)
     ATTRIBUTE_NONNULL(1);
+bool
+virHostdevIsVFIODevice(const virDomainHostdevDef *hostdev)
+    ATTRIBUTE_NONNULL(1);
 
 /* functions used by NodeDevDetach/Reattach/Reset */
 int virHostdevPCINodeDeviceDetach(virHostdevManagerPtr mgr,