[libvirt] [PATCH] cpu: Let explicit features override model features

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

On 07/21/13 14:37, Jiri Denemark wrote:
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
ACK. Peter

On Mon, Jul 22, 2013 at 13:41:44 +0200, Peter Krempa wrote:
On 07/21/13 14:37, Jiri Denemark wrote:
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
ACK.
Pushed, thanks. Jirka
participants (2)
-
Jiri Denemark
-
Peter Krempa