]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuBuildHostdevMediatedDevProps: Format USB host devices via JSON
authorPeter Krempa <pkrempa@redhat.com>
Fri, 1 Oct 2021 09:24:04 +0000 (11:24 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 12 Oct 2021 08:26:03 +0000 (10:26 +0200)
The 'usb-host' device has the following types according to QEMU for
properties we control:

  hostdevice=<str>
  hostbus=<uint32>       -  (default: 0)
  hostaddr=<uint32>      -  (default: 0)
  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 de10043059c62c5c2e10300a4e99bf93e506190e..fcb1e3944f7dac0c791e85744ea2720dee2fdb84 100644 (file)
@@ -4789,15 +4789,17 @@ qemuBuildPCIHostdevDevStr(const virDomainDef *def,
 }
 
 
-char *
-qemuBuildUSBHostdevDevStr(const virDomainDef *def,
-                          virDomainHostdevDef *dev,
-                          virQEMUCaps *qemuCaps)
+virJSONValue *
+qemuBuildUSBHostdevDevProps(const virDomainDef *def,
+                            virDomainHostdevDef *dev,
+                            virQEMUCaps *qemuCaps)
 {
-    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+    g_autoptr(virJSONValue) props = NULL;
     virDomainHostdevSubsysUSB *usbsrc = &dev->source.subsys.u.usb;
+    unsigned int hostbus = 0;
+    unsigned int hostaddr = 0;
+    g_autofree char *hostdevice = NULL;
 
-    virBufferAddLit(&buf, "usb-host");
     if (!dev->missing) {
         if (usbsrc->bus == 0 && usbsrc->device == 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -4806,21 +4808,28 @@ qemuBuildUSBHostdevDevStr(const virDomainDef *def,
         }
 
         if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_HOST_HOSTDEVICE)) {
-            virBufferAsprintf(&buf, ",hostdevice=/dev/bus/usb/%03d/%03d",
-                              usbsrc->bus, usbsrc->device);
+            hostdevice = g_strdup_printf("/dev/bus/usb/%03d/%03d",
+                                         usbsrc->bus, usbsrc->device);
         } else {
-            virBufferAsprintf(&buf, ",hostbus=%d,hostaddr=%d",
-                              usbsrc->bus, usbsrc->device);
+            hostbus = usbsrc->bus;
+            hostaddr = usbsrc->device;
         }
     }
-    virBufferAsprintf(&buf, ",id=%s", dev->info->alias);
-    if (dev->info->bootIndex)
-        virBufferAsprintf(&buf, ",bootindex=%u", dev->info->bootIndex);
 
-    if (qemuBuildDeviceAddressStr(&buf, def, dev->info) < 0)
+    if (virJSONValueObjectCreate(&props,
+                                 "s:driver", "usb-host",
+                                 "S:hostdevice", hostdevice,
+                                 "p:hostbus", hostbus,
+                                 "p:hostaddr", hostaddr,
+                                 "s:id", dev->info->alias,
+                                 "p:bootindex",  dev->info->bootIndex,
+                                 NULL) < 0)
         return NULL;
 
-    return virBufferContentAndReset(&buf);
+    if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
+        return NULL;
+
+    return g_steal_pointer(&props);
 }
 
 
@@ -5512,12 +5521,11 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
         switch ((virDomainHostdevSubsysType) subsys->type) {
         /* USB */
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
-            virCommandAddArg(cmd, "-device");
-            if (!(devstr =
-                  qemuBuildUSBHostdevDevStr(def, hostdev, qemuCaps)))
+            if (!(devprops = qemuBuildUSBHostdevDevProps(def, hostdev, qemuCaps)))
                 return -1;
-            virCommandAddArg(cmd, devstr);
 
+            if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0)
+                return -1;
             break;
 
         /* PCI */
index 45a9cb0ac1515a7809e56edf168dbe686fd87771..6995780f8387e48d8fa403ef0c2b56829b20a548 100644 (file)
@@ -177,9 +177,10 @@ int qemuBuildRNGBackendProps(virDomainRNGDef *rng,
                              virJSONValue **props);
 
 /* Current, best practice */
-char *qemuBuildUSBHostdevDevStr(const virDomainDef *def,
-                                virDomainHostdevDef *dev,
-                                virQEMUCaps *qemuCaps);
+virJSONValue *
+qemuBuildUSBHostdevDevProps(const virDomainDef *def,
+                            virDomainHostdevDef *dev,
+                            virQEMUCaps *qemuCaps);
 
 char *qemuBuildSCSIHostdevDevStr(const virDomainDef *def,
                                  virDomainHostdevDef *dev,
index 8250ca76a2d0d09abc7b880b4e6dc4269904321c..e1db3d55f332437e5f280980a352d58f3f6ba227 100644 (file)
@@ -2573,7 +2573,7 @@ qemuDomainAttachHostUSBDevice(virQEMUDriver *driver,
                               virDomainHostdevDef *hostdev)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
-    g_autofree char *devstr = NULL;
+    g_autoptr(virJSONValue) devprops = NULL;
     bool added = false;
     bool teardowncgroup = false;
     bool teardownlabel = false;
@@ -2601,13 +2601,13 @@ qemuDomainAttachHostUSBDevice(virQEMUDriver *driver,
 
     if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
         goto cleanup;
-    if (!(devstr = qemuBuildUSBHostdevDevStr(vm->def, hostdev, priv->qemuCaps)))
+    if (!(devprops = qemuBuildUSBHostdevDevProps(vm->def, hostdev, priv->qemuCaps)))
         goto cleanup;
 
     VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs+1);
 
     qemuDomainObjEnterMonitor(driver, vm);
-    ret = qemuMonitorAddDevice(priv->mon, devstr);
+    ret = qemuMonitorAddDeviceProps(priv->mon, &devprops);
     if (qemuDomainObjExitMonitor(driver, vm) < 0) {
         ret = -1;
         goto cleanup;