
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