[libvirt] [PATCH v3 12/13] Implement CPU selection in QEMU driver
Jiri Denemark
jdenemar at redhat.com
Thu Dec 17 14:15:13 UTC 2009
> > diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> > +
> > +int
> > +qemudProbeCPUModels(const char *qemu,
> > + const char *arch,
> > + unsigned int *count,
> > + const char ***cpus)
> > +{
...
> > + qemudParseCPUModels parse;
> > +
> > + if (count)
> > + *count = 0;
> > + if (cpus)
> > + *cpus = NULL;
> > +
...
> > + if (len < 0) {
> > + virReportSystemError(NULL, errno, "%s",
> > + _("Unable to read QEMU supported CPU models"));
> > + goto cleanup;
> > + }
> > +
> > + if (parse(output, count, cpus) < 0) {
>
> Can you put this in a nice namespace, qemuParseCPUs or something
> along those lines.
This was discussed on IRC and "no" is the result. It's just a local
variable...
> > +static int
> > +qemudCapsInitCPU(virCapsPtr caps,
> > + const char *arch)
> > +{
> > + virCPUDefPtr cpu = NULL;
> > + union cpuData *data = NULL;
> > + virNodeInfo nodeinfo;
> > + int ret = -1;
> > +
> > + if (VIR_ALLOC(cpu) < 0
> > + || !(cpu->arch = strdup(arch))) {
> > + virReportOOMError(NULL);
> > + goto error;
> > + }
> > +
> > + if (nodeGetInfo(NULL, &nodeinfo))
> > + goto error;
> > +
> > + cpu->type = VIR_CPU_TYPE_HOST;
> > + cpu->sockets = nodeinfo.sockets * nodeinfo.nodes;
>
> I'm not sure this is the right thing todo here, since it means
> this data for 'sockets' differs from that shown by the nodeinfo
> command. If an app needs the total number of sockets, they can
> already calculate that either from the nodeinfo API, or from
> the NUMA topology data in the cpabilities, so we don't need to
> do it here too. Just make it match nodeinfo.sockets.
OK, makes sense.
> > @@ -832,8 +1027,17 @@ virCapsPtr qemudCapsInit(virCapsPtr old_caps) {
> > VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities");
> > }
> >
> > + if (old_caps == NULL || old_caps->host.cpu == NULL) {
> > + if (qemudCapsInitCPU(caps, utsname.machine) < 0)
> > + VIR_WARN0("Failed to get host CPU");
> > + }
> > + else {
> > + caps->host.cpu = old_caps->host.cpu;
> > + old_caps->host.cpu = NULL;
> > + }
> > +
> > virCapabilitiesAddHostMigrateTransport(caps,
> > - "tcp");
> > + "Tcp");
>
> Why this change ? The migrate transport is the uri prefix, so this is
> changing the semantics.
Ah, it must have happened when rebasing to latest master and solving
conflicts. It looks like I hit ~ by accident or something like that. Thanks
for spotting that.
> > + if (qemudProbeCPUModels(emulator, ut->machine, &ncpus, &cpus) < 0)
> > + goto cleanup;
> > +
> > + if (ncpus > 0 && host && def->cpu && def->cpu->model) {
> > + virCPUCompareResult cmp;
> > +
> > + cmp = cpuGuestData(conn, host, def->cpu, &data);
> > + switch (cmp) {
> > + case VIR_CPU_COMPARE_INCOMPATIBLE:
> > + qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> > + "%s", _("guest CPU is not compatible with host CPU"));
> > + /* fall through */
> > + case VIR_CPU_COMPARE_ERROR:
> > + goto cleanup;
> > +
> > + default:
> > + break;
> > + }
> > +
> > + if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(ut->machine)))
> > + goto no_memory;
> > +
> > + if (qemudProbeCPUModels(emulator, ut->machine, &ncpus, &cpus) < 0
> > + || cpuDecode(conn, guest, data, ncpus, cpus) < 0)
> > + goto cleanup;
>
> Can't we avoid calling Probe again here, since we alrady did this 20
> lines earlier. This second time will leak memory from the first time.
Sure. The second call wasn't supposed to be there.
Thanks.
Jirka
More information about the libvir-list
mailing list