On Wed, Jan 21, 2015 at 16:01:00 +0800, Zhu Guihua wrote: > qemuBuildCPUDeviceStr being introduced is responsible for creating command > line argument for '-device' for given cpu device. > > Signed-off-by: Zhu Guihua <zhugh.fnst@xxxxxxxxxxxxxx> > --- > src/qemu/qemu_command.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ > src/qemu/qemu_command.h | 5 +++++ > 2 files changed, 55 insertions(+) > > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index 2ee3e10..824ad29 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -5956,6 +5956,50 @@ static char *qemuBuildTPMDevStr(const virDomainDef *def, > } > > > +int > +qemuBuildCPUDeviceStr(char **deviceStr, > + virDomainCPUDefPtr dev, > + virQEMUCapsPtr qemuCaps) > +{ > + virBuffer buf = VIR_BUFFER_INITIALIZER; > + > + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU64_CPU)) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + _("%s not supported in this QEMU binary"), dev->driver); You blindly assume that the user passed the correct model here and not any other invalid string. As I've already said, having this converted to an enum makes things easier. > + goto error; > + } > + > + virBufferAsprintf(&buf, "%s,id=%s,apic-id=%d", > + dev->driver, dev->info.alias, > + dev->apic_id); Having a buffer for a single virBufferAsprintf case is a bit overkill. > + > + if (virBufferCheckError(&buf) < 0) > + goto error; > + > + *deviceStr = virBufferContentAndReset(&buf); > + return 0; > + > + error: > + virBufferFreeAndReset(&buf); > + return -1; > +} > + > +static int > +qemuBuildCPUDeviceCommandLine(virCommandPtr cmd, > + virDomainCPUDefPtr dev, > + virQEMUCapsPtr qemuCaps) > +{ > + char *devstr = NULL; > + > + if (qemuBuildCPUDeviceStr(&devstr, dev, qemuCaps) < 0) > + return -1; > + > + virCommandAddArgList(cmd, "-device", devstr, NULL); > + VIR_FREE(devstr); > + return 0; > +} > + > + > static char *qemuBuildSmbiosBiosStr(virSysinfoDefPtr def) > { > virBuffer buf = VIR_BUFFER_INITIALIZER; > @@ -9862,6 +9906,12 @@ qemuBuildCommandLine(virConnectPtr conn, > goto error; > } > > + /* add cpu devices */ > + for (i = 0; i < def->ncpus; i++) { > + if (qemuBuildCPUDeviceCommandLine(cmd, def->cpus[i], qemuCaps) < 0) > + goto error; > + } As I've asked before. The question here is whether this is equivalent with just increasing the vCPU count in the "-cpu" argument. If not it will require a bit more work for setting cgroups, numa pinning and other stuff. If they are equivalent we should use that instead and have the existing code do the magic. Peter
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list