This cleans up creating QEMU command line and makes it easier when
adding hotplug support.

Signed-off-by: Pavel Hrdina <[email protected]>
---
 src/qemu/qemu_command.c | 7 ++-----
 src/qemu/qemu_domain.c  | 4 ++--
 src/qemu/qemu_domain.h  | 2 +-
 src/qemu/qemu_process.c | 6 ++++--
 tests/qemuxmlconftest.c | 6 ++++--
 5 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index f400835332..204fdf152b 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5357,19 +5357,16 @@ qemuBuildIOMMUFDCommandLine(virCommand *cmd,
                             virDomainObj *vm)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
-    g_autofree char *fdstr = g_strdup_printf("%d", priv->iommufd);
     g_autoptr(virJSONValue) props = NULL;
 
     if (!virDomainDefHasPCIHostdevWithIOMMUFD(def))
         return 0;
 
-    virCommandPassFD(cmd, priv->iommufd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
-
-    priv->iommufd = -1;
+    qemuFDPassDirectTransferCommand(priv->iommufd, cmd);
 
     if (qemuMonitorCreateObjectProps(&props, "iommufd",
                                      "iommufd0",
-                                     "S:fd", fdstr,
+                                     "S:fd", 
qemuFDPassDirectGetPath(priv->iommufd),
                                      NULL) < 0)
         return -1;
 
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 64b01e524f..d9cd9324e0 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1975,7 +1975,7 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
 
     priv->migrationRecoverSetup = false;
 
-    VIR_FORCE_CLOSE(priv->iommufd);
+    g_clear_pointer(&priv->iommufd, qemuFDPassDirectFree);
 
     g_clear_pointer(&priv->memoryBackingDir, g_free);
 }
@@ -2044,7 +2044,7 @@ qemuDomainObjPrivateAlloc(void *opaque)
     priv->blockjobs = virHashNew(virObjectUnref);
     priv->fds = virHashNew(g_object_unref);
 
-    priv->iommufd = -1;
+    priv->iommufd = NULL;
     priv->pidMonitored = -1;
 
     /* agent commands block by default, user can choose different behavior */
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 510a8339b0..c6430b1bfb 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -264,7 +264,7 @@ struct _qemuDomainObjPrivate {
     /* named file descriptor groups associated with the VM */
     GHashTable *fds;
 
-    int iommufd;
+    qemuFDPassDirect *iommufd;
 
     char *memoryBackingDir;
 };
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index c5c1ef77ec..c814f992bb 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -7689,13 +7689,15 @@ static int
 qemuProcessOpenIommuFd(virDomainObj *vm)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
+    int iommufd;
 
     VIR_DEBUG("Opening IOMMU FD for domain %s", vm->def->name);
 
-    if ((priv->iommufd = virIOMMUFDOpenDevice()) < 0)
+    if ((iommufd = virIOMMUFDOpenDevice()) < 0)
         return -1;
 
-    VIR_DEBUG("Opened IOMMU FD %d for domain %s", priv->iommufd, 
vm->def->name);
+    priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
+
     return 0;
 }
 
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 4ab004a954..13055eef84 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -412,8 +412,10 @@ testQemuPrepareHostdev(virDomainObj *vm)
         }
     }
 
-    if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def))
-        priv->iommufd = 0;
+    if (virDomainDefHasPCIHostdevWithIOMMUFD(vm->def)) {
+        int iommufd = 0;
+        priv->iommufd = qemuFDPassDirectNew("iommufd", &iommufd);
+    }
 }
 
 
-- 
2.53.0

Reply via email to