<div dir="ltr">Hi<br><div><br><div class="gmail_quote"><div dir="ltr">On Fri, Feb 10, 2017 at 6:57 PM Michal Privoznik <<a href="mailto:mprivozn@redhat.com">mprivozn@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Since these two functions are nearly identical (with<br class="gmail_msg">
qemuSetupHostdevCgroup actually calling virCgroupAllowDevicePath)<br class="gmail_msg">
we can have one function call the other and thus de-duplicate<br class="gmail_msg">
some code.<br class="gmail_msg">
<br class="gmail_msg">
Signed-off-by: Michal Privoznik <<a href="mailto:mprivozn@redhat.com" class="gmail_msg" target="_blank">mprivozn@redhat.com</a>><br class="gmail_msg"></blockquote><br><br>Reviewed-by: Marc-André Lureau <<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>><br><br><br> <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br class="gmail_msg">
 src/qemu/qemu_cgroup.c | 147 +++++--------------------------------------------<br class="gmail_msg">
 src/qemu/qemu_domain.c |  31 +++++++++--<br class="gmail_msg">
 src/qemu/qemu_domain.h |   4 ++<br class="gmail_msg">
 3 files changed, 43 insertions(+), 139 deletions(-)<br class="gmail_msg">
<br class="gmail_msg">
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c<br class="gmail_msg">
index 89854b5bd..19832c209 100644<br class="gmail_msg">
--- a/src/qemu/qemu_cgroup.c<br class="gmail_msg">
+++ b/src/qemu/qemu_cgroup.c<br class="gmail_msg">
@@ -264,147 +264,26 @@ int<br class="gmail_msg">
 qemuSetupHostdevCgroup(virDomainObjPtr vm,<br class="gmail_msg">
                        virDomainHostdevDefPtr dev)<br class="gmail_msg">
 {<br class="gmail_msg">
-    int ret = -1;<br class="gmail_msg">
     qemuDomainObjPrivatePtr priv = vm->privateData;<br class="gmail_msg">
-    virDomainHostdevSubsysUSBPtr usbsrc = &dev->source.subsys.u.usb;<br class="gmail_msg">
-    virDomainHostdevSubsysPCIPtr pcisrc = &dev->source.subsys.u.pci;<br class="gmail_msg">
-    virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi;<br class="gmail_msg">
-    virDomainHostdevSubsysSCSIVHostPtr hostsrc = &dev->source.subsys.u.scsi_host;<br class="gmail_msg">
-    virPCIDevicePtr pci = NULL;<br class="gmail_msg">
-    virUSBDevicePtr usb = NULL;<br class="gmail_msg">
-    virSCSIDevicePtr scsi = NULL;<br class="gmail_msg">
-    virSCSIVHostDevicePtr host = NULL;<br class="gmail_msg">
     char *path = NULL;<br class="gmail_msg">
-    int rv;<br class="gmail_msg">
+    int perms;<br class="gmail_msg">
+    int ret = -1;<br class="gmail_msg">
<br class="gmail_msg">
-    /* currently this only does something for PCI devices using vfio<br class="gmail_msg">
-     * for device assignment, but it is called for *all* hostdev<br class="gmail_msg">
-     * devices.<br class="gmail_msg">
-     */<br class="gmail_msg">
+    if (qemuDomainGetHostdevPath(dev, &path, &perms) < 0)<br class="gmail_msg">
+        goto cleanup;<br class="gmail_msg">
<br class="gmail_msg">
-    if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DEVICES))<br class="gmail_msg">
-        return 0;<br class="gmail_msg">
-<br class="gmail_msg">
-    if (dev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {<br class="gmail_msg">
-<br class="gmail_msg">
-        switch ((virDomainHostdevSubsysType) dev->source.subsys.type) {<br class="gmail_msg">
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:<br class="gmail_msg">
-            if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {<br class="gmail_msg">
-                pci = virPCIDeviceNew(pcisrc->addr.domain,<br class="gmail_msg">
-                                      pcisrc->addr.bus,<br class="gmail_msg">
-                                      pcisrc->addr.slot,<br class="gmail_msg">
-                                      pcisrc->addr.function);<br class="gmail_msg">
-                if (!pci)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-                if (!(path = virPCIDeviceGetIOMMUGroupDev(pci)))<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-                VIR_DEBUG("Cgroup allow %s for PCI device assignment", path);<br class="gmail_msg">
-                rv = virCgroupAllowDevicePath(priv->cgroup, path,<br class="gmail_msg">
-                                              VIR_CGROUP_DEVICE_RW, false);<br class="gmail_msg">
-                virDomainAuditCgroupPath(vm, priv->cgroup,<br class="gmail_msg">
-                                         "allow", path, "rw", rv == 0);<br class="gmail_msg">
-                if (rv < 0)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-            }<br class="gmail_msg">
-            break;<br class="gmail_msg">
-<br class="gmail_msg">
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:<br class="gmail_msg">
-            /* NB: hostdev->missing wasn't previously checked in the<br class="gmail_msg">
-             * case of hotplug, only when starting a domain. Now it is<br class="gmail_msg">
-             * always checked, and the cgroup setup skipped if true.<br class="gmail_msg">
-             */<br class="gmail_msg">
-            if (dev->missing)<br class="gmail_msg">
-                break;<br class="gmail_msg">
-            if ((usb = virUSBDeviceNew(usbsrc->bus, usbsrc->device,<br class="gmail_msg">
-                                       NULL)) == NULL) {<br class="gmail_msg">
-                goto cleanup;<br class="gmail_msg">
-            }<br class="gmail_msg">
-<br class="gmail_msg">
-            if (VIR_STRDUP(path, virUSBDeviceGetPath(usb)) < 0)<br class="gmail_msg">
-                goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-            VIR_DEBUG("Process path '%s' for USB device", path);<br class="gmail_msg">
-            rv = virCgroupAllowDevicePath(priv->cgroup, path,<br class="gmail_msg">
-                                          VIR_CGROUP_DEVICE_RW, false);<br class="gmail_msg">
-            virDomainAuditCgroupPath(vm, priv->cgroup, "allow", path, "rw", rv == 0);<br class="gmail_msg">
-            if (rv < 0)<br class="gmail_msg">
-                goto cleanup;<br class="gmail_msg">
-            break;<br class="gmail_msg">
-<br class="gmail_msg">
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: {<br class="gmail_msg">
-            if (scsisrc->protocol ==<br class="gmail_msg">
-                VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {<br class="gmail_msg">
-                virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;<br class="gmail_msg">
-                /* Follow qemuSetupDiskCgroup() and qemuSetImageCgroupInternal()<br class="gmail_msg">
-                 * which does nothing for non local storage<br class="gmail_msg">
-                 */<br class="gmail_msg">
-                VIR_DEBUG("Not updating cgroups for hostdev iSCSI path '%s'",<br class="gmail_msg">
-                          iscsisrc->path);<br class="gmail_msg">
-            } else {<br class="gmail_msg">
-                virDomainHostdevSubsysSCSIHostPtr scsihostsrc =<br class="gmail_msg">
-                    &scsisrc->u.host;<br class="gmail_msg">
-                if ((scsi = virSCSIDeviceNew(NULL,<br class="gmail_msg">
-                                             scsihostsrc->adapter,<br class="gmail_msg">
-                                             scsihostsrc->bus,<br class="gmail_msg">
-                                             scsihostsrc->target,<br class="gmail_msg">
-                                             scsihostsrc->unit,<br class="gmail_msg">
-                                             dev->readonly,<br class="gmail_msg">
-                                             dev->shareable)) == NULL)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-                if (VIR_STRDUP(path, virSCSIDeviceGetPath(scsi)) < 0)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-                VIR_DEBUG("Process path '%s' for SCSI device", path);<br class="gmail_msg">
-                rv = virCgroupAllowDevicePath(priv->cgroup, path,<br class="gmail_msg">
-                                              virSCSIDeviceGetReadonly(scsi) ?<br class="gmail_msg">
-                                              VIR_CGROUP_DEVICE_READ :<br class="gmail_msg">
-                                              VIR_CGROUP_DEVICE_RW, false);<br class="gmail_msg">
-<br class="gmail_msg">
-                virDomainAuditCgroupPath(vm, priv->cgroup, "allow", path,<br class="gmail_msg">
-                                         virSCSIDeviceGetReadonly(scsi) ? "r" : "rw",<br class="gmail_msg">
-                                         rv == 0);<br class="gmail_msg">
-                if (rv < 0)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-            }<br class="gmail_msg">
-            break;<br class="gmail_msg">
-        }<br class="gmail_msg">
-<br class="gmail_msg">
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: {<br class="gmail_msg">
-            if (hostsrc->protocol ==<br class="gmail_msg">
-                VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_VHOST) {<br class="gmail_msg">
-                if (!(host = virSCSIVHostDeviceNew(hostsrc->wwpn)))<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-                if (VIR_STRDUP(path, virSCSIVHostDeviceGetPath(host)) < 0)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-<br class="gmail_msg">
-                VIR_DEBUG("Process path '%s' for scsi_host device", path);<br class="gmail_msg">
-<br class="gmail_msg">
-                rv = virCgroupAllowDevicePath(priv->cgroup, path,<br class="gmail_msg">
-                                              VIR_CGROUP_DEVICE_RW, false);<br class="gmail_msg">
-<br class="gmail_msg">
-                virDomainAuditCgroupPath(vm, priv->cgroup,<br class="gmail_msg">
-                                         "allow", path, "rw", rv == 0);<br class="gmail_msg">
-                if (rv < 0)<br class="gmail_msg">
-                    goto cleanup;<br class="gmail_msg">
-            }<br class="gmail_msg">
-            break;<br class="gmail_msg">
-        }<br class="gmail_msg">
-<br class="gmail_msg">
-        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:<br class="gmail_msg">
-            break;<br class="gmail_msg">
-        }<br class="gmail_msg">
+    if (!path) {<br class="gmail_msg">
+        /* There's no path that we need to allow. Claim success. */<br class="gmail_msg">
+        ret = 0;<br class="gmail_msg">
+        goto cleanup;<br class="gmail_msg">
     }<br class="gmail_msg">
<br class="gmail_msg">
-    ret = 0;<br class="gmail_msg">
+    VIR_DEBUG("Cgroup allow %s perms=%d", path, perms);<br class="gmail_msg">
+    ret = virCgroupAllowDevicePath(priv->cgroup, path, perms, false);<br class="gmail_msg">
+    virDomainAuditCgroupPath(vm, priv->cgroup, "allow", path,<br class="gmail_msg">
+                             virCgroupGetDevicePermsString(perms), ret == 0);<br class="gmail_msg">
+<br class="gmail_msg">
  cleanup:<br class="gmail_msg">
-    virPCIDeviceFree(pci);<br class="gmail_msg">
-    virUSBDeviceFree(usb);<br class="gmail_msg">
-    virSCSIDeviceFree(scsi);<br class="gmail_msg">
-    virSCSIVHostDeviceFree(host);<br class="gmail_msg">
     VIR_FREE(path);<br class="gmail_msg">
     return ret;<br class="gmail_msg">
 }<br class="gmail_msg">
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c<br class="gmail_msg">
index 7c696963e..c6d32525f 100644<br class="gmail_msg">
--- a/src/qemu/qemu_domain.c<br class="gmail_msg">
+++ b/src/qemu/qemu_domain.c<br class="gmail_msg">
@@ -6831,9 +6831,21 @@ qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
-static int<br class="gmail_msg">
+/**<br class="gmail_msg">
+ * qemuDomainGetHostdevPath:<br class="gmail_msg">
+ * @dev: host device definition<br class="gmail_msg">
+ * @path: resulting path to @dev<br class="gmail_msg">
+ * @perms: Optional pointer to VIR_CGROUP_DEVICE_* perms<br class="gmail_msg">
+ *<br class="gmail_msg">
+ * For given device @dev fetch its host path and store it at @path. Optionally,<br class="gmail_msg">
+ * caller can get @perms on the path (e.g. rw/ro).<br class="gmail_msg">
+ *<br class="gmail_msg">
+ * Returns 0 on success, -1 otherwise.<br class="gmail_msg">
+ */<br class="gmail_msg">
+int<br class="gmail_msg">
 qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,<br class="gmail_msg">
-                         char **path)<br class="gmail_msg">
+                         char **path,<br class="gmail_msg">
+                         int *perms)<br class="gmail_msg">
 {<br class="gmail_msg">
     int ret = -1;<br class="gmail_msg">
     virDomainHostdevSubsysUSBPtr usbsrc = &dev->source.subsys.u.usb;<br class="gmail_msg">
@@ -6864,6 +6876,8 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,<br class="gmail_msg">
                 if (!(tmpPath = virPCIDeviceGetIOMMUGroupDev(pci)))<br class="gmail_msg">
                     goto cleanup;<br class="gmail_msg">
                 freeTmpPath = true;<br class="gmail_msg">
+                if (perms)<br class="gmail_msg">
+                    *perms = VIR_CGROUP_DEVICE_RW;<br class="gmail_msg">
             }<br class="gmail_msg">
             break;<br class="gmail_msg">
<br class="gmail_msg">
@@ -6878,6 +6892,8 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,<br class="gmail_msg">
<br class="gmail_msg">
             if (!(tmpPath = (char *) virUSBDeviceGetPath(usb)))<br class="gmail_msg">
                 goto cleanup;<br class="gmail_msg">
+            if (perms)<br class="gmail_msg">
+                *perms = VIR_CGROUP_DEVICE_RW;<br class="gmail_msg">
             break;<br class="gmail_msg">
<br class="gmail_msg">
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:<br class="gmail_msg">
@@ -6902,6 +6918,9 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,<br class="gmail_msg">
<br class="gmail_msg">
                 if (!(tmpPath = (char *) virSCSIDeviceGetPath(scsi)))<br class="gmail_msg">
                     goto cleanup;<br class="gmail_msg">
+                if (perms)<br class="gmail_msg">
+                    *perms = virSCSIDeviceGetReadonly(scsi) ?<br class="gmail_msg">
+                        VIR_CGROUP_DEVICE_READ :VIR_CGROUP_DEVICE_RW;<br class="gmail_msg"></blockquote><div><br></div><div>missing a space after : <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
             }<br class="gmail_msg">
             break;<br class="gmail_msg">
<br class="gmail_msg">
@@ -6913,6 +6932,8 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,<br class="gmail_msg">
<br class="gmail_msg">
                 if (!(tmpPath = (char *) virSCSIVHostDeviceGetPath(host)))<br class="gmail_msg">
                     goto cleanup;<br class="gmail_msg">
+                if (perms)<br class="gmail_msg">
+                    *perms = VIR_CGROUP_DEVICE_RW;<br class="gmail_msg">
             }<br class="gmail_msg">
             break;<br class="gmail_msg">
         }<br class="gmail_msg">
@@ -7328,7 +7349,7 @@ qemuDomainSetupHostdev(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,<br class="gmail_msg">
     int ret = -1;<br class="gmail_msg">
     char *path = NULL;<br class="gmail_msg">
<br class="gmail_msg">
-    if (qemuDomainGetHostdevPath(dev, &path) < 0)<br class="gmail_msg">
+    if (qemuDomainGetHostdevPath(dev, &path, NULL) < 0)<br class="gmail_msg">
         goto cleanup;<br class="gmail_msg">
<br class="gmail_msg">
     if (!path) {<br class="gmail_msg">
@@ -7964,7 +7985,7 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,<br class="gmail_msg">
     if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))<br class="gmail_msg">
         return 0;<br class="gmail_msg">
<br class="gmail_msg">
-    if (qemuDomainGetHostdevPath(hostdev, &path) < 0)<br class="gmail_msg">
+    if (qemuDomainGetHostdevPath(hostdev, &path, NULL) < 0)<br class="gmail_msg">
         goto cleanup;<br class="gmail_msg">
<br class="gmail_msg">
     if (!path) {<br class="gmail_msg">
@@ -7995,7 +8016,7 @@ qemuDomainNamespaceTeardownHostdev(virQEMUDriverPtr driver,<br class="gmail_msg">
     if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))<br class="gmail_msg">
         return 0;<br class="gmail_msg">
<br class="gmail_msg">
-    if (qemuDomainGetHostdevPath(hostdev, &path) < 0)<br class="gmail_msg">
+    if (qemuDomainGetHostdevPath(hostdev, &path, NULL) < 0)<br class="gmail_msg">
         goto cleanup;<br class="gmail_msg">
<br class="gmail_msg">
     if (!path) {<br class="gmail_msg">
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h<br class="gmail_msg">
index 5cfa3e114..f81550e2f 100644<br class="gmail_msg">
--- a/src/qemu/qemu_domain.h<br class="gmail_msg">
+++ b/src/qemu/qemu_domain.h<br class="gmail_msg">
@@ -802,6 +802,10 @@ int qemuDomainCheckMonitor(virQEMUDriverPtr driver,<br class="gmail_msg">
 bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,<br class="gmail_msg">
                                 virQEMUCapsPtr qemuCaps);<br class="gmail_msg">
<br class="gmail_msg">
+int qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,<br class="gmail_msg">
+                             char **path,<br class="gmail_msg">
+                             int *perms);<br class="gmail_msg">
+<br class="gmail_msg">
 int qemuDomainBuildNamespace(virQEMUDriverPtr driver,<br class="gmail_msg">
                              virDomainObjPtr vm);<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg"></blockquote><br><br>otherwise, <br><br>Reviewed-by: Marc-André Lureau <<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>><br><br><br> <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2.11.0<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
libvir-list mailing list<br class="gmail_msg">
<a href="mailto:libvir-list@redhat.com" class="gmail_msg" target="_blank">libvir-list@redhat.com</a><br class="gmail_msg">
<a href="https://www.redhat.com/mailman/listinfo/libvir-list" rel="noreferrer" class="gmail_msg" target="_blank">https://www.redhat.com/mailman/listinfo/libvir-list</a><br class="gmail_msg">
</blockquote></div></div></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">Marc-André Lureau<br></div></div>