Generate the 'zpci' device via JSON. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_command.c | 81 +++++++++++++++++++---------------------- src/qemu/qemu_command.h | 3 +- src/qemu/qemu_hotplug.c | 27 +++++--------- 3 files changed, 49 insertions(+), 62 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9f593151ab..e8043f0055 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2232,48 +2232,43 @@ qemuBuildDiskDeviceStr(const virDomainDef *def, return virBufferContentAndReset(&opt); } -char * -qemuBuildZPCIDevStr(virDomainDeviceInfo *dev) -{ - g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - - virBufferAsprintf(&buf, - "zpci,uid=%u,fid=%u,target=%s,id=zpci%u", - dev->addr.pci.zpci.uid.value, - dev->addr.pci.zpci.fid.value, - dev->alias, - dev->addr.pci.zpci.uid.value); - - return virBufferContentAndReset(&buf); -} -static int -qemuCommandAddZPCIDevice(virCommand *cmd, - virDomainDeviceInfo *dev) +virJSONValue * +qemuBuildZPCIDevProps(virDomainDeviceInfo *dev) { - g_autofree char *devstr = NULL; + virJSONValue *props = NULL; - virCommandAddArg(cmd, "-device"); - - if (!(devstr = qemuBuildZPCIDevStr(dev))) - return -1; - - virCommandAddArg(cmd, devstr); + virJSONValueObjectCreate(&props, + "s:driver", "zpci", + "u:uid", dev->addr.pci.zpci.uid.value, + "u:fid", dev->addr.pci.zpci.fid.value, + "s:target", dev->alias, + "f:id", g_strdup_printf("zpci%u", dev->addr.pci.zpci.uid.value), + NULL); - return 0; + return props; } + static int qemuCommandAddExtDevice(virCommand *cmd, - virDomainDeviceInfo *dev) + virDomainDeviceInfo *dev, + virQEMUCaps *qemuCaps) { if (dev->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI || dev->addr.pci.extFlags == VIR_PCI_ADDRESS_EXTENSION_NONE) { return 0; } - if (dev->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) - return qemuCommandAddZPCIDevice(cmd, dev); + if (dev->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { + g_autoptr(virJSONValue) devprops = NULL; + + if (!(devprops = qemuBuildZPCIDevProps(dev))) + return -1; + + if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0) + return -1; + } return 0; } @@ -2480,7 +2475,7 @@ qemuBuildDiskCommandLine(virCommand *cmd, !virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) return 0; - if (qemuCommandAddExtDevice(cmd, &disk->info) < 0) + if (qemuCommandAddExtDevice(cmd, &disk->info, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -2588,7 +2583,7 @@ qemuBuildVHostUserFsCommandLine(virCommand *cmd, virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, chrdevstr); - if (qemuCommandAddExtDevice(cmd, &fs->info) < 0) + if (qemuCommandAddExtDevice(cmd, &fs->info, priv->qemuCaps) < 0) return -1; if (!(devstr = qemuBuildVHostUserFsDevStr(fs, def, chardev_alias, priv))) @@ -2686,7 +2681,7 @@ qemuBuildFSDevCommandLine(virCommand *cmd, return -1; virCommandAddArg(cmd, fsdevstr); - if (qemuCommandAddExtDevice(cmd, &fs->info) < 0) + if (qemuCommandAddExtDevice(cmd, &fs->info, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -3228,7 +3223,7 @@ qemuBuildControllersByTypeCommandLine(virCommand *cmd, return -1; if (devstr) { - if (qemuCommandAddExtDevice(cmd, &cont->info) < 0) + if (qemuCommandAddExtDevice(cmd, &cont->info, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -4177,7 +4172,7 @@ qemuBuildWatchdogCommandLine(virCommand *cmd, if (!def->watchdog) return 0; - if (qemuCommandAddExtDevice(cmd, &def->watchdog->info) < 0) + if (qemuCommandAddExtDevice(cmd, &def->watchdog->info, qemuCaps) < 0) return -1; if (!(props = qemuBuildWatchdogDevProps(def, watchdog))) @@ -4229,7 +4224,7 @@ qemuBuildMemballoonCommandLine(virCommand *cmd, if (qemuBuildDeviceAddressProps(props, def, &def->memballoon->info) < 0) return -1; - if (qemuCommandAddExtDevice(cmd, &def->memballoon->info) < 0) + if (qemuCommandAddExtDevice(cmd, &def->memballoon->info, qemuCaps) < 0) return -1; if (qemuBuildDeviceCommandlineFromJSON(cmd, props, qemuCaps) < 0) @@ -4376,7 +4371,7 @@ qemuBuildInputCommandLine(virCommand *cmd, for (i = 0; i < def->ninputs; i++) { virDomainInputDef *input = def->inputs[i]; - if (qemuCommandAddExtDevice(cmd, &input->info) < 0) + if (qemuCommandAddExtDevice(cmd, &input->info, qemuCaps) < 0) return -1; if (input->type == VIR_DOMAIN_INPUT_TYPE_EVDEV) { @@ -4522,7 +4517,7 @@ qemuBuildSoundCommandLine(virCommand *cmd, if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) { virCommandAddArgList(cmd, "-soundhw", "pcspk", NULL); } else { - if (qemuCommandAddExtDevice(cmd, &sound->info) < 0) + if (qemuCommandAddExtDevice(cmd, &sound->info, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -4711,7 +4706,7 @@ qemuBuildVideoCommandLine(virCommand *cmd, if (video->type == VIR_DOMAIN_VIDEO_TYPE_NONE) continue; - if (qemuCommandAddExtDevice(cmd, &def->videos[i]->info) < 0) + if (qemuCommandAddExtDevice(cmd, &def->videos[i]->info, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -5527,7 +5522,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd, if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED) continue; - if (qemuCommandAddExtDevice(cmd, hostdev->info) < 0) + if (qemuCommandAddExtDevice(cmd, hostdev->info, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -5873,7 +5868,7 @@ qemuBuildRNGCommandLine(virLogManager *logManager, return -1; /* add the device */ - if (qemuCommandAddExtDevice(cmd, &rng->info) < 0) + if (qemuCommandAddExtDevice(cmd, &rng->info, qemuCaps) < 0) return -1; if (!(devprops = qemuBuildRNGDevProps(def, rng, qemuCaps))) @@ -8990,14 +8985,14 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver, * New way: -netdev type=tap,id=netdev1 -device e1000,id=netdev1 */ if (qemuDomainSupportsNicdev(def, net)) { - if (qemuCommandAddExtDevice(cmd, &net->info) < 0) + if (qemuCommandAddExtDevice(cmd, &net->info, qemuCaps) < 0) goto cleanup; if (!(nic = qemuBuildNicDevStr(def, net, net->driver.virtio.queues, qemuCaps))) goto cleanup; virCommandAddArgList(cmd, "-device", nic, NULL); } else if (!requireNicdev) { - if (qemuCommandAddExtDevice(cmd, &net->info) < 0) + if (qemuCommandAddExtDevice(cmd, &net->info, qemuCaps) < 0) goto cleanup; if (!(nic = qemuBuildLegacyNicStr(net))) @@ -9375,7 +9370,7 @@ qemuBuildShmemCommandLine(virLogManager *logManager, if (!devProps) return -1; - if (qemuCommandAddExtDevice(cmd, &shmem->info) < 0) + if (qemuCommandAddExtDevice(cmd, &shmem->info, qemuCaps) < 0) return -1; if (qemuBuildDeviceCommandlineFromJSON(cmd, devProps, qemuCaps) < 0) @@ -10520,7 +10515,7 @@ qemuBuildVsockCommandLine(virCommand *cmd, virCommandPassFD(cmd, priv->vhostfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); priv->vhostfd = -1; - if (qemuCommandAddExtDevice(cmd, &vsock->info) < 0) + if (qemuCommandAddExtDevice(cmd, &vsock->info, qemuCaps) < 0) return -1; virCommandAddArgList(cmd, "-device", devstr, NULL); diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index e8561c0a3c..81cdbed384 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -208,7 +208,8 @@ virJSONValue * qemuBuildRedirdevDevProps(const virDomainDef *def, virDomainRedirdevDef *dev); -char *qemuBuildZPCIDevStr(virDomainDeviceInfo *dev); +virJSONValue * +qemuBuildZPCIDevProps(virDomainDeviceInfo *dev); int qemuNetworkPrepareDevices(virDomainDef *def); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3c76e9be91..ea7028eae5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -138,22 +138,6 @@ qemuDomainDeleteDevice(virDomainObj *vm, } -static int -qemuDomainAttachZPCIDevice(qemuMonitor *mon, - virDomainDeviceInfo *info) -{ - g_autofree char *devstr_zpci = NULL; - - if (!(devstr_zpci = qemuBuildZPCIDevStr(info))) - return -1; - - if (qemuMonitorAddDevice(mon, devstr_zpci) < 0) - return -1; - - return 0; -} - - static int qemuDomainDetachZPCIDevice(qemuMonitor *mon, virDomainDeviceInfo *info) @@ -178,8 +162,15 @@ qemuDomainAttachExtensionDevice(qemuMonitor *mon, return 0; } - if (info->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) - return qemuDomainAttachZPCIDevice(mon, info); + if (info->addr.pci.extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { + g_autoptr(virJSONValue) devprops = NULL; + + if (!(devprops = qemuBuildZPCIDevProps(info))) + return -1; + + if (qemuMonitorAddDeviceProps(mon, &devprops) < 0) + return -1; + } return 0; } -- 2.31.1