Message ID | 20190702153535.9851-41-ehabkost@redhat.com |
---|---|
State | New |
Headers | show |
Series | [PULL,v3,01/42] hw/boards: Add struct CpuTopology to MachineState | expand |
Hi, Eduardo On 7/2/2019 11:35 PM, Eduardo Habkost wrote: > Add new version of Cascadelake-Server CPU model, setting > stepping=5 and enabling the IA32_ARCH_CAPABILITIES MSR > with some flags. > > The new feature will introduce a new host software requirement, > breaking our CPU model runnability promises. This means we can't > enable the new CPU model version by default in QEMU 4.1, because > management software isn't ready yet to resolve CPU model aliases. > This is why "pc-*-4.1" will keep returning Cascadelake-Server-v1 > if "-cpu Cascadelake-Server" is specified. > > Includes a test case to ensure the right combinations of > machine-type + CPU model + command-line feature flags will work > as expected. > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > Message-Id: <20190628002844.24894-10-ehabkost@redhat.com> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > --- > target/i386/cpu.c | 14 +++++ > tests/acceptance/x86_cpu_model_versions.py | 73 ++++++++++++++++++++++ > 2 files changed, 87 insertions(+) > > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > index 9b16cffb22..0298396a91 100644 > --- a/target/i386/cpu.c > +++ b/target/i386/cpu.c > @@ -2343,6 +2343,20 @@ static X86CPUDefinition builtin_x86_defs[] = { > CPUID_6_EAX_ARAT, > .xlevel = 0x80000008, > .model_id = "Intel Xeon Processor (Cascadelake)", > + .versions = (X86CPUVersionDefinition[]) { > + { .version = 1 }, > + { .version = 2, > + .props = (PropValue[]) { > + { "stepping", "5" }, > + { "arch-capabilities", "on" }, > + { "rdctl-no", "on" }, > + { "ibrs-all", "on" }, > + { "skip-l1dfl-vmentry", "on" }, > + { /* end of list */ } > + }, > + }, > + { /* end of list */ } > + } seems you forgot to fix the stepping and add feature "mds-no".
On Wed, Jul 03, 2019 at 09:16:57AM +0800, Xiaoyao Li wrote: > Hi, Eduardo > > On 7/2/2019 11:35 PM, Eduardo Habkost wrote: > > Add new version of Cascadelake-Server CPU model, setting > > stepping=5 and enabling the IA32_ARCH_CAPABILITIES MSR > > with some flags. > > > > The new feature will introduce a new host software requirement, > > breaking our CPU model runnability promises. This means we can't > > enable the new CPU model version by default in QEMU 4.1, because > > management software isn't ready yet to resolve CPU model aliases. > > This is why "pc-*-4.1" will keep returning Cascadelake-Server-v1 > > if "-cpu Cascadelake-Server" is specified. > > > > Includes a test case to ensure the right combinations of > > machine-type + CPU model + command-line feature flags will work > > as expected. > > > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > > Message-Id: <20190628002844.24894-10-ehabkost@redhat.com> > > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > > --- > > target/i386/cpu.c | 14 +++++ > > tests/acceptance/x86_cpu_model_versions.py | 73 ++++++++++++++++++++++ > > 2 files changed, 87 insertions(+) > > > > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > > index 9b16cffb22..0298396a91 100644 > > --- a/target/i386/cpu.c > > +++ b/target/i386/cpu.c > > @@ -2343,6 +2343,20 @@ static X86CPUDefinition builtin_x86_defs[] = { > > CPUID_6_EAX_ARAT, > > .xlevel = 0x80000008, > > .model_id = "Intel Xeon Processor (Cascadelake)", > > + .versions = (X86CPUVersionDefinition[]) { > > + { .version = 1 }, > > + { .version = 2, > > + .props = (PropValue[]) { > > + { "stepping", "5" }, > > + { "arch-capabilities", "on" }, > > + { "rdctl-no", "on" }, > > + { "ibrs-all", "on" }, > > + { "skip-l1dfl-vmentry", "on" }, > > + { /* end of list */ } > > + }, > > + }, > > + { /* end of list */ } > > + } > > seems you forgot to fix the stepping and add feature "mds-no". I plan to fix it in a follow up patch to avoid holding the current pull request for another day.
diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 9b16cffb22..0298396a91 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2343,6 +2343,20 @@ static X86CPUDefinition builtin_x86_defs[] = { CPUID_6_EAX_ARAT, .xlevel = 0x80000008, .model_id = "Intel Xeon Processor (Cascadelake)", + .versions = (X86CPUVersionDefinition[]) { + { .version = 1 }, + { .version = 2, + .props = (PropValue[]) { + { "stepping", "5" }, + { "arch-capabilities", "on" }, + { "rdctl-no", "on" }, + { "ibrs-all", "on" }, + { "skip-l1dfl-vmentry", "on" }, + { /* end of list */ } + }, + }, + { /* end of list */ } + } }, { .name = "Icelake-Client", diff --git a/tests/acceptance/x86_cpu_model_versions.py b/tests/acceptance/x86_cpu_model_versions.py index 165c0c7601..1c9fd6a56e 100644 --- a/tests/acceptance/x86_cpu_model_versions.py +++ b/tests/acceptance/x86_cpu_model_versions.py @@ -25,6 +25,10 @@ import avocado_qemu import re +def get_cpu_prop(vm, prop): + cpu_path = vm.command('query-cpus')[0].get('qom_path') + return vm.command('qom-get', path=cpu_path, property=prop) + class X86CPUModelAliases(avocado_qemu.Test): """ Validation of PC CPU model versions and CPU model aliases @@ -229,3 +233,72 @@ class X86CPUModelAliases(avocado_qemu.Test): 'qemu64-v1 must not be an alias') self.validate_aliases(cpus) + + def test_Cascadelake_arch_capabilities_result(self): + # machine-type only: + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.1') + vm.add_args('-cpu', 'Cascadelake-Server,x-force-features=on,check=off,enforce=off') + vm.launch() + self.assertFalse(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.1 + Cascadelake-Server should not have arch-capabilities') + + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.0') + vm.add_args('-cpu', 'Cascadelake-Server,x-force-features=on,check=off,enforce=off') + vm.launch() + self.assertFalse(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.0 + Cascadelake-Server should not have arch-capabilities') + + # command line must override machine-type if CPU model is not versioned: + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.0') + vm.add_args('-cpu', 'Cascadelake-Server,x-force-features=on,check=off,enforce=off,+arch-capabilities') + vm.launch() + self.assertTrue(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.0 + Cascadelake-Server,+arch-capabilities should have arch-capabilities') + + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.1') + vm.add_args('-cpu', 'Cascadelake-Server,x-force-features=on,check=off,enforce=off,-arch-capabilities') + vm.launch() + self.assertFalse(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.1 + Cascadelake-Server,-arch-capabilities should not have arch-capabilities') + + # versioned CPU model overrides machine-type: + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.0') + vm.add_args('-cpu', 'Cascadelake-Server-v1,x-force-features=on,check=off,enforce=off') + vm.launch() + self.assertFalse(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.1 + Cascadelake-Server-v1 should not have arch-capabilities') + + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.0') + vm.add_args('-cpu', 'Cascadelake-Server-v2,x-force-features=on,check=off,enforce=off') + vm.launch() + self.assertTrue(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.1 + Cascadelake-Server-v1 should have arch-capabilities') + + # command line must override machine-type and versioned CPU model: + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.0') + vm.add_args('-cpu', 'Cascadelake-Server,x-force-features=on,check=off,enforce=off,+arch-capabilities') + vm.launch() + self.assertTrue(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.0 + Cascadelake-Server-v1,+arch-capabilities should have arch-capabilities') + + vm = self.get_vm() + vm.add_args('-S') + vm.set_machine('pc-i440fx-4.1') + vm.add_args('-cpu', 'Cascadelake-Server-v2,x-force-features=on,check=off,enforce=off,-arch-capabilities') + vm.launch() + self.assertFalse(get_cpu_prop(vm, 'arch-capabilities'), + 'pc-i440fx-4.1 + Cascadelake-Server-v2,-arch-capabilities should not have arch-capabilities')