]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: cgroup: Adjust cgroups' logic to allow mediated devices
authorErik Skultety <eskultet@redhat.com>
Fri, 3 Feb 2017 13:13:25 +0000 (14:13 +0100)
committerErik Skultety <eskultet@redhat.com>
Mon, 27 Mar 2017 13:39:35 +0000 (15:39 +0200)
As goes for all the other hostdev device types, grant the qemu process
access to /dev/vfio/<mediated_device_iommu_group>.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
src/qemu/qemu_domain.c

index 8a9719e1f987b781c030be1aa9f7f8164fbe124f..cfaf8f8dd54994f97a8809f4aa373ec89e8bfe72 100644 (file)
@@ -7002,10 +7002,12 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
     virDomainHostdevSubsysPCIPtr pcisrc = &dev->source.subsys.u.pci;
     virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi;
     virDomainHostdevSubsysSCSIVHostPtr hostsrc = &dev->source.subsys.u.scsi_host;
+    virDomainHostdevSubsysMediatedDevPtr mdevsrc = &dev->source.subsys.u.mdev;
     virPCIDevicePtr pci = NULL;
     virUSBDevicePtr usb = NULL;
     virSCSIDevicePtr scsi = NULL;
     virSCSIVHostDevicePtr host = NULL;
+    virMediatedDevicePtr mdev = NULL;
     char *tmpPath = NULL;
     bool freeTmpPath = false;
     bool includeVFIO = false;
@@ -7106,6 +7108,17 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
         }
 
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+            if (!(mdev = virMediatedDeviceNew(mdevsrc->uuidstr,
+                                              mdevsrc->model)))
+                goto cleanup;
+
+            if (!(tmpPath = virMediatedDeviceGetIOMMUGroupDev(mdev)))
+                goto cleanup;
+
+            freeTmpPath = true;
+            includeVFIO = true;
+            perm = VIR_CGROUP_DEVICE_RW;
+            break;
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
             break;
         }
@@ -7155,6 +7168,7 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
     virUSBDeviceFree(usb);
     virSCSIDeviceFree(scsi);
     virSCSIVHostDeviceFree(host);
+    virMediatedDeviceFree(mdev);
     if (freeTmpPath)
         VIR_FREE(tmpPath);
     return ret;