On Thu, Feb 25, 2021 at 14:23:06 +0100, Tim Wiederhake wrote:
See
https://bugzilla.redhat.com/show_bug.cgi?id=1840770
Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
---
src/qemu/qemu_process.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index bfa742577f..cecf606312 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6149,6 +6149,33 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
if (virCPUConvertLegacy(hostarch, def->cpu) < 0)
return -1;
+ if (def->cpu->check != VIR_CPU_CHECK_NONE) {
+ virCPUDefPtr host;
+ size_t i;
+
+ host = virQEMUCapsGetHostModel(qemuCaps, def->virtType,
+ VIR_QEMU_CAPS_HOST_CPU_FULL);
+
+ for (i = 0; i < def->cpu->nfeatures; ++i) {
+ virCPUFeatureDefPtr feature;
+
+ if (def->cpu->features[i].policy != VIR_CPU_FEATURE_FORBID)
+ continue;
+
+ feature = virCPUDefFindFeature(host, def->cpu->features[i].name);
This would crash in case virQEMUCapsGetHostModel returned NULL, which
may happen quite easily, especially on non-x86 architectures.
+ if (!feature)
+ continue;
+
+ if (feature->policy == VIR_CPU_FEATURE_DISABLE)
+ continue;
+
+ virReportError(VIR_ERR_CPU_INCOMPATIBLE,
+ _("Host CPU provides forbidden feature
'%s'"),
+ def->cpu->features[i].name);
+ return -1;
+ }
+ }
+
This new code is a good candidate for separation into a new function. I
believe we don't need architecture specific implementation for this
function, but something like virCPUCheckForbiddenFeatures in
src/cpu/cpu.c seems like a logical choice.
/* nothing to update for host-passthrough / maximum */
if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH &&
def->cpu->mode != VIR_CPU_MODE_MAXIMUM) {
Jirka