Until now CPU features inherited from a specified CPU model could only be overridden with 'disable' policy. With this patch, any explicitly specified feature always overrides the same feature inherited from a CPU model regardless on the specified policy. The CPU in x86-exact-force-Haswell.xml would previously be incompatible with x86-host-SandyBridge.xml CPU even though x86-host-SandyBridge.xml provides all features required by x86-exact-force-Haswell.xml. --- src/cpu/cpu_x86.c | 5 +++++ tests/cputest.c | 1 + tests/cputestdata/x86-exact-force-Haswell.xml | 15 +++++++++++++++ tests/cputestdata/x86-host-SandyBridge.xml | 6 ++++++ 4 files changed, 27 insertions(+) create mode 100644 tests/cputestdata/x86-exact-force-Haswell.xml create mode 100644 tests/cputestdata/x86-host-SandyBridge.xml diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 4564bd4..a388f0f 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -1223,6 +1223,11 @@ x86Compute(virCPUDefPtr host, goto out; } + /* first remove features that were inherited from the CPU model and were + * explicitly forced, disabled, or made optional + */ + x86DataSubtract(cpu_require->data, cpu_force->data); + x86DataSubtract(cpu_require->data, cpu_optional->data); x86DataSubtract(cpu_require->data, cpu_disable->data); result = x86ModelCompare(host_model, cpu_require); if (result == SUBSET || result == UNRELATED) { diff --git a/tests/cputest.c b/tests/cputest.c index d3865c4..803e395 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -581,6 +581,7 @@ mymain(void) DO_TEST_COMPARE("x86", "host", "pentium3-amd", VIR_CPU_COMPARE_INCOMPATIBLE); DO_TEST_COMPARE("x86", "host-amd", "pentium3-amd", VIR_CPU_COMPARE_SUPERSET); DO_TEST_COMPARE("x86", "host-worse", "nehalem-force", VIR_CPU_COMPARE_IDENTICAL); + DO_TEST_COMPARE("x86", "host-SandyBridge", "exact-force-Haswell", VIR_CPU_COMPARE_IDENTICAL); /* guest updates for migration * automatically compares host CPU with the result */ diff --git a/tests/cputestdata/x86-exact-force-Haswell.xml b/tests/cputestdata/x86-exact-force-Haswell.xml new file mode 100644 index 0000000..614ed7e --- /dev/null +++ b/tests/cputestdata/x86-exact-force-Haswell.xml @@ -0,0 +1,15 @@ +<cpu mode='custom' match='exact'> + <model fallback='allow'>Haswell</model> + <feature policy='force' name='pcid'/> + <feature policy='force' name='rtm'/> + <feature policy='force' name='invpcid'/> + <feature policy='force' name='erms'/> + <feature policy='force' name='bmi2'/> + <feature policy='optional' name='smep'/> + <feature policy='optional' name='avx2'/> + <feature policy='optional' name='hle'/> + <feature policy='force' name='bmi1'/> + <feature policy='force' name='fsgsbase'/> + <feature policy='disable' name='movbe'/> + <feature policy='disable' name='fma'/> +</cpu> diff --git a/tests/cputestdata/x86-host-SandyBridge.xml b/tests/cputestdata/x86-host-SandyBridge.xml new file mode 100644 index 0000000..7f26b7b --- /dev/null +++ b/tests/cputestdata/x86-host-SandyBridge.xml @@ -0,0 +1,6 @@ +<cpu> + <arch>x86_64</arch> + <model>SandyBridge</model> + <vendor>Intel</vendor> + <topology sockets='1' cores='2' threads='2'/> +</cpu> -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list