On Tue, 2018-09-04 at 16:39 +0800, Yi Min Zhao wrote: [...] > +char * > +qemuBuildZPCIDevStr(virDomainDeviceInfoPtr dev) > +{ > + virBuffer buf = VIR_BUFFER_INITIALIZER; > + > + virBufferAddLit(&buf, "zpci"); > + virBufferAsprintf(&buf, ",uid=%u", dev->addr.pci.zpci.uid); > + virBufferAsprintf(&buf, ",fid=%u", dev->addr.pci.zpci.fid); > + virBufferAsprintf(&buf, ",target=%s", dev->alias); > + virBufferAsprintf(&buf, ",id=zpci%u", dev->addr.pci.zpci.uid); All of the above can be a single virBufferAsprintf() call. [...] > +static int > +qemuAppendZPCIDevStr(virCommandPtr cmd, > + virDomainDeviceInfoPtr dev) I'd call this qemuCommandAddZPCIDevice() or something like that. > +{ > + char *devstr = NULL; > + > + virCommandAddArg(cmd, "-device"); Empty line here. > + if (!(devstr = qemuBuildZPCIDevStr(dev))) > + return -1; [...] > +static int > +qemuBuildExtensionCommandLine(virCommandPtr cmd, > + virDomainDeviceInfoPtr dev) Same comment about the naming as above. > +{ > + if (!virZPCIDeviceAddressIsEmpty(&dev->addr.pci.zpci)) > + return qemuAppendZPCIDevStr(cmd, dev); > + > + return 0; I'd rather see this as if (virZPCIDeviceAddressIsEmpty(&dev->addr.pci.zpci)) return 0; return qemuAppendZPCIDevStr(cmd, dev); instead. [...] > @@ -4327,6 +4390,9 @@ qemuBuildSoundCommandLine(virCommandPtr cmd, > if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) { > virCommandAddArgList(cmd, "-soundhw", "pcspk", NULL); > } else { > + if (qemuBuildExtensionCommandLine(cmd, &sound->info) < 0) > + return -1; Do the codecs (handled immediately below) require a zpci device as well? I figure they don't, but I also don't know much about sound devices :) [...] > @@ -9086,6 +9171,9 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, > > switch ((virDomainShmemModel)shmem->model) { > case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM: > + if (qemuBuildExtensionCommandLine(cmd, &shmem->info) < 0) > + return -1; > + > devstr = qemuBuildShmemDevLegacyStr(def, shmem, qemuCaps); > break; > > @@ -9104,6 +9192,9 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, > > ATTRIBUTE_FALLTHROUGH; > case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL: > + if (qemuBuildExtensionCommandLine(cmd, &shmem->info) < 0) > + return -1; > + > devstr = qemuBuildShmemDevStr(def, shmem, qemuCaps); > break; This looks wrong: you should call qemuBuildExtensionCommandLine() later on, like if (!devstr) return -1; if (qemuBuildExtensionCommandLine(cmd, &shmem->info) < 0) return -1; virCommandAddArgList(cmd, "-device", devstr, NULL); instead. -- Andrea Bolognani / Red Hat / Virtualization -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list