mirror of
https://github.com/libvirt/libvirt.git
synced 2026-09-03 20:53:04 -05:00
qemu: Convert vfioDeviceFd to qemuFDPassDirect
This cleans up creating QEMU command line and makes it easier when adding hotplug support. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
+5
-10
@@ -4818,12 +4818,10 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
|
||||
pcisrc->driver.iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(dev);
|
||||
|
||||
if (hostdevPriv->vfioDeviceFd != -1) {
|
||||
g_autofree char *fdstr = g_strdup_printf("%d", hostdevPriv->vfioDeviceFd);
|
||||
if (virJSONValueObjectAdd(&props, "S:fd", fdstr, NULL) < 0)
|
||||
return NULL;
|
||||
hostdevPriv->vfioDeviceFd = -1;
|
||||
}
|
||||
if (virJSONValueObjectAdd(&props,
|
||||
"S:fd", qemuFDPassDirectGetPath(hostdevPriv->vfioDeviceFd),
|
||||
NULL) < 0)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
|
||||
@@ -5273,10 +5271,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
|
||||
if (subsys->u.pci.driver.iommufd == VIR_TRISTATE_BOOL_YES) {
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
|
||||
if (hostdevPriv->vfioDeviceFd != -1) {
|
||||
virCommandPassFD(cmd, hostdevPriv->vfioDeviceFd,
|
||||
VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||
}
|
||||
qemuFDPassDirectTransferCommand(hostdevPriv->vfioDeviceFd, cmd);
|
||||
}
|
||||
|
||||
if (!(devprops = qemuBuildPCIHostdevDevProps(def, hostdev)))
|
||||
|
||||
@@ -1245,7 +1245,7 @@ qemuDomainHostdevPrivateDispose(void *obj)
|
||||
{
|
||||
qemuDomainHostdevPrivate *priv = obj;
|
||||
|
||||
VIR_FORCE_CLOSE(priv->vfioDeviceFd);
|
||||
g_clear_pointer(&priv->vfioDeviceFd, qemuFDPassDirectFree);
|
||||
}
|
||||
|
||||
|
||||
@@ -1271,7 +1271,7 @@ qemuDomainHostdevPrivateNew(void)
|
||||
if (!(priv = virObjectNew(qemuDomainHostdevPrivateClass)))
|
||||
return NULL;
|
||||
|
||||
priv->vfioDeviceFd = -1;
|
||||
priv->vfioDeviceFd = NULL;
|
||||
|
||||
return (virObject *) priv;
|
||||
}
|
||||
|
||||
@@ -463,7 +463,7 @@ struct _qemuDomainHostdevPrivate {
|
||||
virObject parent;
|
||||
|
||||
/* VFIO device file descriptor for iommufd passthrough */
|
||||
int vfioDeviceFd;
|
||||
qemuFDPassDirect *vfioDeviceFd;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -7714,10 +7714,14 @@ qemuProcessOpenVfioDeviceFd(virDomainHostdevDef *hostdev)
|
||||
{
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
virDomainHostdevSubsysPCI *pci = &hostdev->source.subsys.u.pci;
|
||||
g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
|
||||
int vfioDeviceFd;
|
||||
|
||||
if ((hostdevPriv->vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
|
||||
if ((vfioDeviceFd = virPCIDeviceOpenVfioFd(&pci->addr)) < 0)
|
||||
return -1;
|
||||
|
||||
hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -357,8 +357,10 @@ testQemuPrepareHostdevPCI(virDomainHostdevDef *hostdev)
|
||||
qemuDomainHostdevPrivate *hostdevPriv = QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev);
|
||||
|
||||
if (virHostdevIsPCIDeviceWithIOMMUFD(hostdev)) {
|
||||
g_autofree char *name = g_strdup_printf("hostdev-%s-fd", hostdev->info->alias);
|
||||
/* Use a placeholder FD value for tests */
|
||||
hostdevPriv->vfioDeviceFd = 0;
|
||||
int vfioDeviceFD = 0;
|
||||
hostdevPriv->vfioDeviceFd = qemuFDPassDirectNew(name, &vfioDeviceFD);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user