[PATCH 033/103] qemu: command: Introduce JSON equivalent of qemuBuildDeviceAddressStr

Ján Tomko jtomko at redhat.com
Fri Oct 8 12:24:27 UTC 2021


On a Thursday in 2021, Peter Krempa wrote:
>Upcoming patches will start converting the formatting of arguments for
>-device from a string to JSON so that we can keep proper types around
>when using it via QMP.
>
>This means we will need an equivalet for the device address builder

*equivalent

>function. 'qemuBuildDeviceAddressProps' provides equal functionality,
>but the output differs for fields where a number is expected, where
>we've previously formatted a hex value but now end up with a decimal
>value per JSON standard.
>
>For given address types I've selected an example device and used
>'-device $DEV,help' to obtain the current types recognized by qemu:
>
>Note that 'bus' is not shown below, but it's already a string so we can
>keep using it as a string.
>
>VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI (virtio-balloon-pci)
>  acpi-index=<uint32>    -  (default: 0)
>  addr=<int32>           - Slot and optional function number, example: 06.0 or 06 (default: -1)
>  multifunction=<bool>   - on/off (default: false)
>
>Note that 'addr' is here defined as 'int32' but in fact internally in
>qemu is an alternate type between a number and a string so we can keep
>using strings here.
>
>VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB (usb-tablet)
>  port=<str>
>
>VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO (spapr-vty)
>  reg=<uint32>           -  (default: 4294967295)
>
>VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW (virtio-blk-cww)
>  devno=<str>            - Identifier of an I/O device in the channel subsystem, example: fe.1.23ab
>
>VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA (isa-serial)
>  iobase=<uint32>        -  (default: 4294967295)
>  irq=<uint32>           -  (default: 4294967295)
>
>VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM (pc-dimm)
>  slot=<int32>           -  (default: -1)
>  addr=<uint64>          -  (default: 0)
>
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> src/qemu/qemu_command.c | 101 +++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 100 insertions(+), 1 deletion(-)
>
>diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>index 56acd9a109..565b1970dc 100644
>--- a/src/qemu/qemu_command.c
>+++ b/src/qemu/qemu_command.c
>@@ -416,7 +416,7 @@ qemuBuildDeviceAddressPCIStr(virBuffer *buf,
> }
>
>
>-static int
>+static int G_GNUC_UNUSED
> qemuBuildDeviceAddressStr(virBuffer *buf,
>                           const virDomainDef *domainDef,
>                           virDomainDeviceInfo *info)
>@@ -484,6 +484,105 @@ qemuBuildDeviceAddressStr(virBuffer *buf,
> }
>
>
>+static int G_GNUC_UNUSED
>+qemuBuildDeviceAddressProps(virJSONValue *props,
>+                            const virDomainDef *domainDef,
>+                            virDomainDeviceInfo *info)
>+{
>+    switch ((virDomainDeviceAddressType) info->type) {
>+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: {
>+        g_autofree char *pciaddr = NULL;
>+
>+        if (info->addr.pci.function != 0)
>+            pciaddr = g_strdup_printf("0x%x.0x%x", info->addr.pci.slot, info->addr.pci.function);
>+        else
>+            pciaddr = g_strdup_printf("0x%x", info->addr.pci.slot);
>+
>+        if (virJSONValueObjectAdd(props,
>+                                  "F:bus", qemuBuildDeviceAddressPCIGetBus(domainDef, info),

Without the '[fF]' patch, this only needs one autofree'd variable.

>+                                  "T:multifunction", info->addr.pci.multi,
>+                                  "s:addr", pciaddr,
>+                                  "p:acpi-index", info->acpiIndex,
>+                                  NULL) < 0)
>+            return -1;
>+
>+        return 0;
>+    }
>+        break;
>+
>+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: {
>+        const char *contAlias = NULL;
>+        g_auto(virBuffer) port = VIR_BUFFER_INITIALIZER;
>+
>+        if (!(contAlias = virDomainControllerAliasFind(domainDef,
>+                                                       VIR_DOMAIN_CONTROLLER_TYPE_USB,
>+                                                       info->addr.usb.bus)))
>+            return -1;
>+
>+        virDomainUSBAddressPortFormatBuf(&port, info->addr.usb.port);
>+
>+        if (virJSONValueObjectAdd(props,
>+                                  "f:bus", g_strdup_printf("%s.0", contAlias),

Here too.

>+                                  "S:port", virBufferCurrentContent(&port),
>+                                  NULL) < 0)
>+            return -1;

Reviewed-by: Ján Tomko <jtomko at redhat.com>

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20211008/b7888a5b/attachment-0001.sig>


More information about the libvir-list mailing list