]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildHostdevCommandLine: Build mediated device commandline via JSON
authorPeter Krempa <pkrempa@redhat.com>
Fri, 1 Oct 2021 08:17:01 +0000 (10:17 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 12 Oct 2021 08:26:03 +0000 (10:26 +0200)
The 'vfio-pci-nohotplug' device has the following property types
according to QEMU:

  display=<OnOffAuto>    - on/off/auto (default: "off")
  sysfsdev=<str>
  ramfb=<bool>
  bootindex=<int32>

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_hotplug.c

index 3b8c514fa2e4801ff19686d8bff8502a50b03702..8fab9fac235806b6076d6f6592fb9f4f63de5830 100644 (file)
@@ -5348,40 +5348,34 @@ qemuBuildHostdevMdevModelTypeString(virDomainHostdevSubsysMediatedDev *mdev)
 }
 
 
-char *
-qemuBuildHostdevMediatedDevStr(const virDomainDef *def,
-                               virDomainHostdevDef *dev,
-                               virQEMUCaps *qemuCaps G_GNUC_UNUSED)
+virJSONValue *
+qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
+                                 virDomainHostdevDef *dev)
 {
-    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+    g_autoptr(virJSONValue) props = NULL;
     virDomainHostdevSubsysMediatedDev *mdevsrc = &dev->source.subsys.u.mdev;
     g_autofree char *mdevPath = NULL;
-    const char *dev_str = NULL;
 
     mdevPath = virMediatedDeviceGetSysfsPath(mdevsrc->uuidstr);
-    dev_str = qemuBuildHostdevMdevModelTypeString(mdevsrc);
 
-    if (!dev_str)
+    if (virJSONValueObjectCreate(&props,
+                                 "s:driver", qemuBuildHostdevMdevModelTypeString(mdevsrc),
+                                 "s:id", dev->info->alias,
+                                 "s:sysfsdev", mdevPath,
+                                 "S:display", qemuOnOffAuto(mdevsrc->display),
+                                 NULL) < 0)
         return NULL;
 
-    virBufferAdd(&buf, dev_str, -1);
-    virBufferAsprintf(&buf, ",id=%s,sysfsdev=%s", dev->info->alias, mdevPath);
-
-    if (mdevsrc->display != VIR_TRISTATE_SWITCH_ABSENT)
-        virBufferAsprintf(&buf, ",display=%s",
-                          virTristateSwitchTypeToString(mdevsrc->display));
-
-    if (qemuBuildDeviceAddressStr(&buf, def, dev->info) < 0)
+    if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
         return NULL;
 
-    if (dev->info->bootIndex)
-        virBufferAsprintf(&buf, ",bootindex=%u", dev->info->bootIndex);
-
-    if (mdevsrc->ramfb == VIR_TRISTATE_SWITCH_ON)
-        virBufferAsprintf(&buf, ",ramfb=%s",
-                          virTristateSwitchTypeToString(mdevsrc->ramfb));
+    if (virJSONValueObjectAdd(props,
+                              "T:ramfb", mdevsrc->ramfb,
+                              "p:bootindex", dev->info->bootIndex,
+                              NULL) < 0)
+        return NULL;
 
-    return virBufferContentAndReset(&buf);
+    return g_steal_pointer(&props);
 }
 
 
@@ -5512,6 +5506,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
         virDomainHostdevSubsys *subsys = &hostdev->source.subsys;
         virDomainHostdevSubsysMediatedDev *mdevsrc = &subsys->u.mdev;
         g_autofree char *devstr = NULL;
+        g_autoptr(virJSONValue) devprops = NULL;
         g_autofree char *vhostfdName = NULL;
         int vhostfd = -1;
 
@@ -5591,12 +5586,11 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
                 return -1;
             }
 
-            virCommandAddArg(cmd, "-device");
-            if (!(devstr =
-                  qemuBuildHostdevMediatedDevStr(def, hostdev, qemuCaps)))
+            if (!(devprops = qemuBuildHostdevMediatedDevProps(def, hostdev)))
                 return -1;
-            virCommandAddArg(cmd, devstr);
 
+            if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0)
+                return -1;
             break;
 
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
index 709b75c25201a3c306eafd1b6531a59d8ad270d1..45a9cb0ac1515a7809e56edf168dbe686fd87771 100644 (file)
@@ -199,10 +199,9 @@ qemuBuildSCSIVHostHostdevDevStr(const virDomainDef *def,
                                 virQEMUCaps *qemuCaps,
                                 char *vhostfdName);
 
-char *
-qemuBuildHostdevMediatedDevStr(const virDomainDef *def,
-                               virDomainHostdevDef *dev,
-                               virQEMUCaps *qemuCaps);
+virJSONValue *
+qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
+                                 virDomainHostdevDef *dev);
 
 char *qemuBuildRedirdevDevStr(const virDomainDef *def,
                               virDomainRedirdevDef *dev,
index 4230f6f70e3dd12e1f3a5a69e9dbfb6f24aa1ca9..8250ca76a2d0d09abc7b880b4e6dc4269904321c 100644 (file)
@@ -2855,7 +2855,7 @@ qemuDomainAttachMediatedDevice(virQEMUDriver *driver,
                                virDomainHostdevDef *hostdev)
 {
     int ret = -1;
-    g_autofree char *devstr = NULL;
+    g_autoptr(virJSONValue) devprops = NULL;
     bool added = false;
     bool teardowncgroup = false;
     bool teardownlabel = false;
@@ -2901,8 +2901,7 @@ qemuDomainAttachMediatedDevice(virQEMUDriver *driver,
     if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
         goto cleanup;
 
-    if (!(devstr = qemuBuildHostdevMediatedDevStr(vm->def, hostdev,
-                                                  priv->qemuCaps)))
+    if (!(devprops = qemuBuildHostdevMediatedDevProps(vm->def, hostdev)))
         goto cleanup;
 
     VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1);
@@ -2912,7 +2911,7 @@ qemuDomainAttachMediatedDevice(virQEMUDriver *driver,
     teardownmemlock = true;
 
     qemuDomainObjEnterMonitor(driver, vm);
-    ret = qemuMonitorAddDevice(priv->mon, devstr);
+    ret = qemuMonitorAddDeviceProps(priv->mon, &devprops);
     if (qemuDomainObjExitMonitor(driver, vm) < 0) {
         ret = -1;
         goto cleanup;