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