mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 07:05:28 +00:00
qemuDomainGetHostdevPath: Don't include /dev/vfio/vfio in returned paths
Now that all callers of qemuDomainGetHostdevPath() handle /dev/vfio/vfio on their own, we can safely drop handling in this function. In near future the decision whether domain needs VFIO file is going to include more device types than just virDomainHostdev. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
f976516542
commit
3a4787a301
@ -375,26 +375,23 @@ qemuSetupHostdevCgroup(virDomainObjPtr vm,
|
||||
virDomainHostdevDefPtr dev)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
char **path = NULL;
|
||||
int *perms = NULL;
|
||||
size_t i, npaths = 0;
|
||||
g_autofree char *path = NULL;
|
||||
int perms;
|
||||
int rv, ret = -1;
|
||||
|
||||
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DEVICES))
|
||||
return 0;
|
||||
|
||||
if (qemuDomainGetHostdevPath(NULL, dev, false, &npaths, &path, &perms) < 0)
|
||||
if (qemuDomainGetHostdevPath(dev, &path, &perms) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < npaths; i++) {
|
||||
VIR_DEBUG("Cgroup allow %s perms=%d", path[i], perms[i]);
|
||||
rv = virCgroupAllowDevicePath(priv->cgroup, path[i], perms[i], false);
|
||||
virDomainAuditCgroupPath(vm, priv->cgroup, "allow", path[i],
|
||||
virCgroupGetDevicePermsString(perms[i]),
|
||||
VIR_DEBUG("Cgroup allow %s perms=%d", path, perms);
|
||||
rv = virCgroupAllowDevicePath(priv->cgroup, path, perms, false);
|
||||
virDomainAuditCgroupPath(vm, priv->cgroup, "allow", path,
|
||||
virCgroupGetDevicePermsString(perms),
|
||||
rv);
|
||||
if (rv < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (qemuHostdevNeedsVFIO(dev)) {
|
||||
VIR_DEBUG("Cgroup allow %s perms=%d", QEMU_DEV_VFIO, VIR_CGROUP_DEVICE_RW);
|
||||
@ -409,10 +406,6 @@ qemuSetupHostdevCgroup(virDomainObjPtr vm,
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
for (i = 0; i < npaths; i++)
|
||||
VIR_FREE(path[i]);
|
||||
VIR_FREE(path);
|
||||
VIR_FREE(perms);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -433,26 +426,22 @@ qemuTeardownHostdevCgroup(virDomainObjPtr vm,
|
||||
virDomainHostdevDefPtr dev)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
char **path = NULL;
|
||||
size_t i, npaths = 0;
|
||||
g_autofree char *path = NULL;
|
||||
int rv, ret = -1;
|
||||
|
||||
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_DEVICES))
|
||||
return 0;
|
||||
|
||||
if (qemuDomainGetHostdevPath(vm->def, dev, true,
|
||||
&npaths, &path, NULL) < 0)
|
||||
if (qemuDomainGetHostdevPath(dev, &path, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < npaths; i++) {
|
||||
VIR_DEBUG("Cgroup deny %s", path[i]);
|
||||
rv = virCgroupDenyDevicePath(priv->cgroup, path[i],
|
||||
VIR_DEBUG("Cgroup deny %s", path);
|
||||
rv = virCgroupDenyDevicePath(priv->cgroup, path,
|
||||
VIR_CGROUP_DEVICE_RWM, false);
|
||||
virDomainAuditCgroupPath(vm, priv->cgroup,
|
||||
"deny", path[i], "rwm", rv);
|
||||
"deny", path, "rwm", rv);
|
||||
if (rv < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (qemuHostdevNeedsVFIO(dev) &&
|
||||
!qemuDomainNeedsVFIO(vm->def)) {
|
||||
@ -467,9 +456,6 @@ qemuTeardownHostdevCgroup(virDomainObjPtr vm,
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
for (i = 0; i < npaths; i++)
|
||||
VIR_FREE(path[i]);
|
||||
VIR_FREE(path);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -13822,29 +13822,23 @@ qemuDomainNeedsVFIO(const virDomainDef *def)
|
||||
|
||||
/**
|
||||
* qemuDomainGetHostdevPath:
|
||||
* @def: domain definition
|
||||
* @dev: host device definition
|
||||
* @teardown: true if device will be removed
|
||||
* @npaths: number of items in @path and @perms arrays
|
||||
* @path: resulting path to @dev
|
||||
* @perms: Optional pointer to VIR_CGROUP_DEVICE_* perms
|
||||
*
|
||||
* For given device @dev fetch its host path and store it at
|
||||
* @path. If a device requires other paths to be present/allowed
|
||||
* they are stored in the @path array after the actual path.
|
||||
* Optionally, caller can get @perms on the path (e.g. rw/ro).
|
||||
* @path. Optionally, caller can get @perms on the path (e.g.
|
||||
* rw/ro).
|
||||
*
|
||||
* The caller is responsible for freeing the memory.
|
||||
* The caller is responsible for freeing the @path when no longer
|
||||
* needed.
|
||||
*
|
||||
* Returns 0 on success, -1 otherwise.
|
||||
*/
|
||||
int
|
||||
qemuDomainGetHostdevPath(virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev,
|
||||
bool teardown,
|
||||
size_t *npaths,
|
||||
char ***path,
|
||||
int **perms)
|
||||
qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
|
||||
char **path,
|
||||
int *perms)
|
||||
{
|
||||
int ret = -1;
|
||||
virDomainHostdevSubsysUSBPtr usbsrc = &dev->source.subsys.u.usb;
|
||||
@ -13857,14 +13851,9 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
|
||||
g_autoptr(virSCSIDevice) scsi = NULL;
|
||||
g_autoptr(virSCSIVHostDevice) host = NULL;
|
||||
g_autofree char *tmpPath = NULL;
|
||||
bool includeVFIO = false;
|
||||
char **tmpPaths = NULL;
|
||||
g_autofree int *tmpPerms = NULL;
|
||||
size_t tmpNpaths = 0;
|
||||
int perm = 0;
|
||||
|
||||
*npaths = 0;
|
||||
|
||||
switch ((virDomainHostdevMode) dev->mode) {
|
||||
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
|
||||
switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
|
||||
@ -13881,12 +13870,6 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
|
||||
goto cleanup;
|
||||
|
||||
perm = VIR_CGROUP_DEVICE_RW;
|
||||
if (teardown) {
|
||||
if (!virDomainDefHasVFIOHostdev(def))
|
||||
includeVFIO = true;
|
||||
} else {
|
||||
includeVFIO = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -13942,7 +13925,6 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
|
||||
if (!(tmpPath = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr)))
|
||||
goto cleanup;
|
||||
|
||||
includeVFIO = true;
|
||||
perm = VIR_CGROUP_DEVICE_RW;
|
||||
break;
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
|
||||
@ -13956,36 +13938,11 @@ qemuDomainGetHostdevPath(virDomainDefPtr def,
|
||||
break;
|
||||
}
|
||||
|
||||
if (tmpPath) {
|
||||
size_t toAlloc = 1;
|
||||
|
||||
if (includeVFIO)
|
||||
toAlloc = 2;
|
||||
|
||||
if (VIR_ALLOC_N(tmpPaths, toAlloc) < 0 ||
|
||||
VIR_ALLOC_N(tmpPerms, toAlloc) < 0)
|
||||
goto cleanup;
|
||||
tmpPaths[0] = g_strdup(tmpPath);
|
||||
tmpNpaths = toAlloc;
|
||||
tmpPerms[0] = perm;
|
||||
|
||||
if (includeVFIO) {
|
||||
tmpPaths[1] = g_strdup(QEMU_DEV_VFIO);
|
||||
tmpPerms[1] = VIR_CGROUP_DEVICE_RW;
|
||||
}
|
||||
}
|
||||
|
||||
*npaths = tmpNpaths;
|
||||
tmpNpaths = 0;
|
||||
*path = tmpPaths;
|
||||
tmpPaths = NULL;
|
||||
if (perms) {
|
||||
*perms = tmpPerms;
|
||||
tmpPerms = NULL;
|
||||
}
|
||||
*path = g_steal_pointer(&tmpPath);
|
||||
if (perms)
|
||||
*perms = perm;
|
||||
ret = 0;
|
||||
cleanup:
|
||||
virStringListFreeCount(tmpPaths, tmpNpaths);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -14486,16 +14443,13 @@ qemuDomainSetupHostdev(virQEMUDriverConfigPtr cfg G_GNUC_UNUSED,
|
||||
const struct qemuDomainCreateDeviceData *data)
|
||||
{
|
||||
int ret = -1;
|
||||
char **path = NULL;
|
||||
size_t i, npaths = 0;
|
||||
g_autofree char *path = NULL;
|
||||
|
||||
if (qemuDomainGetHostdevPath(NULL, dev, false, &npaths, &path, NULL) < 0)
|
||||
if (qemuDomainGetHostdevPath(dev, &path, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < npaths; i++) {
|
||||
if (qemuDomainCreateDevice(path[i], data, false) < 0)
|
||||
if (qemuDomainCreateDevice(path, data, false) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (qemuHostdevNeedsVFIO(dev) &&
|
||||
qemuDomainCreateDevice(QEMU_DEV_VFIO, data, false) < 0)
|
||||
@ -14503,9 +14457,6 @@ qemuDomainSetupHostdev(virQEMUDriverConfigPtr cfg G_GNUC_UNUSED,
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
for (i = 0; i < npaths; i++)
|
||||
VIR_FREE(path[i]);
|
||||
VIR_FREE(path);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -15540,13 +15491,12 @@ qemuDomainNamespaceSetupHostdev(virDomainObjPtr vm,
|
||||
virDomainHostdevDefPtr hostdev)
|
||||
{
|
||||
int ret = -1;
|
||||
char **paths = NULL;
|
||||
size_t i, npaths = 0;
|
||||
g_autofree char *path = NULL;
|
||||
|
||||
if (qemuDomainGetHostdevPath(NULL, hostdev, false, &npaths, &paths, NULL) < 0)
|
||||
if (qemuDomainGetHostdevPath(hostdev, &path, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuDomainNamespaceMknodPaths(vm, (const char **)paths, npaths) < 0)
|
||||
if (qemuDomainNamespaceMknodPath(vm, path) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuHostdevNeedsVFIO(hostdev) &&
|
||||
@ -15556,9 +15506,6 @@ qemuDomainNamespaceSetupHostdev(virDomainObjPtr vm,
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
for (i = 0; i < npaths; i++)
|
||||
VIR_FREE(paths[i]);
|
||||
VIR_FREE(paths);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -15579,14 +15526,12 @@ qemuDomainNamespaceTeardownHostdev(virDomainObjPtr vm,
|
||||
virDomainHostdevDefPtr hostdev)
|
||||
{
|
||||
int ret = -1;
|
||||
char **paths = NULL;
|
||||
size_t i, npaths = 0;
|
||||
g_autofree char *path = NULL;
|
||||
|
||||
if (qemuDomainGetHostdevPath(vm->def, hostdev, true,
|
||||
&npaths, &paths, NULL) < 0)
|
||||
if (qemuDomainGetHostdevPath(hostdev, &path, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuDomainNamespaceUnlinkPaths(vm, (const char **)paths, npaths) < 0)
|
||||
if (qemuDomainNamespaceUnlinkPath(vm, path) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuHostdevNeedsVFIO(hostdev) &&
|
||||
@ -15596,9 +15541,6 @@ qemuDomainNamespaceTeardownHostdev(virDomainObjPtr vm,
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
for (i = 0; i < npaths; i++)
|
||||
VIR_FREE(paths[i]);
|
||||
VIR_FREE(paths);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1099,12 +1099,9 @@ bool qemuDomainSupportsVideoVga(virDomainVideoDefPtr video,
|
||||
|
||||
bool qemuDomainNeedsVFIO(const virDomainDef *def);
|
||||
|
||||
int qemuDomainGetHostdevPath(virDomainDefPtr def,
|
||||
virDomainHostdevDefPtr dev,
|
||||
bool teardown,
|
||||
size_t *npaths,
|
||||
char ***path,
|
||||
int **perms);
|
||||
int qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
|
||||
char **path,
|
||||
int *perms);
|
||||
|
||||
int qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
|
||||
virSecurityManagerPtr mgr,
|
||||
|
Loading…
Reference in New Issue
Block a user