
[...]
+ +virCPUCompareResult +virQEMUCapsCPUModelComparison(virQEMUCapsPtr qemuCaps, + const char *libDir, + uid_t runUid, + gid_t runGid, + virCPUDefPtr cpu_a, + virCPUDefPtr cpu_b, + bool failIncompatible) +{ + qemuProcessQMPPtr proc = NULL; + qemuMonitorCPUModelInfoPtr result = NULL;
Set ret = VIR_CPU_COMPARE_INCOMPATIBLE
+ int ret = -1; + + if (!(proc = qemuProcessQMPNew(qemuCaps->binary, libDir, + runUid, runGid, false))) + goto cleanup; + + if (qemuProcessQMPStart(proc) < 0) + goto cleanup; + + if (qemuMonitorGetCPUModelComparison(proc->mon, cpu_a->model, + cpu_a->nfeatures, cpu_a->features, + cpu_b->model, cpu_b->nfeatures, + cpu_b->features, &result) < 0) + goto cleanup; + + if (STREQ(result->name, "incompatible") || + STREQ(result->name, "subset")) + ret = VIR_CPU_COMPARE_INCOMPATIBLE; + else if (STREQ(result->name, "identical")) + ret = VIR_CPU_COMPARE_IDENTICAL; + else if (STREQ(result->name, "superset")) + ret = VIR_CPU_COMPARE_SUPERSET;
and change this:
+ + if (failIncompatible && ret == VIR_CPU_COMPARE_INCOMPATIBLE) { + ret = VIR_CPU_COMPARE_ERROR; + virReportError(VIR_ERR_CPU_INCOMPATIBLE, NULL); + } + + cleanup: + if (ret < 0) + virQEMUCapsLogProbeFailure(qemuCaps->binary);
To this: cleanup: if (failIncompatible && ret == VIR_CPU_COMPARE_INCOMPATIBLE) { ret = VIR_CPU_COMPARE_ERROR; virReportError(VIR_ERR_CPU_INCOMPATIBLE, NULL); virQEMUCapsLogProbeFailure(qemuCaps->binary); }
+ + qemuMonitorCPUModelInfoFree(result); + qemuProcessQMPFree(proc); + return ret; +}
And now the output will look like this when the xml contains an erroneous CPU model or feature: virsh hypervisor-cpu-compare cpufail.xml CPU described in cpufail.xml is incompatible with the CPU provided by hypervisor on the host virsh hypervisor-cpu-compare cpufail.xml --error error: Failed to compare hypervisor CPU with cpufail.xml error: the CPU is incompatible with host CPU If this output is not acceptable, then perhaps we should further explore option 2 that I described on patch 5. [...]