[PATCH 38/39] x86/mm/pti: Add Warning when booting on a PCID capable CPU
From: Joerg Roedel Warn the user in case the performance can be significantly improved by switching to a 64-bit kernel. Suggested-by: Andy Lutomirski Signed-off-by: Joerg Roedel --- arch/x86/mm/pti.c | 22 ++ 1 file changed, 22 insertions(+) diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c index b879ccd..be8d2cd 100644 --- a/arch/x86/mm/pti.c +++ b/arch/x86/mm/pti.c @@ -517,6 +517,28 @@ void __init pti_init(void) pr_info("enabled\n"); +#ifdef CONFIG_X86_32 + /* +* We check for X86_FEATURE_PCID here. But the init-code will +* clear the feature flag on 32 bit because the feature is not +* supported on 32 bit anyway. To print the warning we need to +* check with cpuid directly again. +*/ + if (cpuid_ecx(0x1) && BIT(17)) { + /* Use printk to work around pr_fmt() */ + printk(KERN_WARNING "\n"); + printk(KERN_WARNING "\n"); + printk(KERN_WARNING "** WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! **\n"); + printk(KERN_WARNING "** **\n"); + printk(KERN_WARNING "** You are using 32-bit PTI on a 64-bit PCID-capable CPU. **\n"); + printk(KERN_WARNING "** Your performance will increase dramatically if you **\n"); + printk(KERN_WARNING "** switch to a 64-bit kernel! **\n"); + printk(KERN_WARNING "** **\n"); + printk(KERN_WARNING "** WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! **\n"); + printk(KERN_WARNING "\n"); + } +#endif + pti_clone_user_shared(); /* Undo all global bits from the init pagetables in head_64.S: */ -- 2.7.4
Re: [PATCH 38/39] x86/mm/pti: Add Warning when booting on a PCID capable CPU
On Fri, Jul 13, 2018 at 11:59:44AM -0700, Andy Lutomirski wrote: > On Wed, Jul 11, 2018 at 4:29 AM, Joerg Roedel wrote: > > From: Joerg Roedel > > > > Warn the user in case the performance can be significantly > > improved by switching to a 64-bit kernel. > > ... > > > +#ifdef CONFIG_X86_32 > > + if (boot_cpu_has(X86_FEATURE_PCID)) { > > I'm a bit confused. Wouldn't the setup_clear_cpu_cap() call in > early_identify_cpu() prevent this from working? Right you are, I don't have a PCID capable system at hand for testing, so I didn't catch this... > Boris, do we have a straightforward way to ask "does the CPU advertise > this feature in CPUID regardless of whether we have it enabled right > now"? I guess we need to call cpuid again. Regards, Joerg
Re: [PATCH 38/39] x86/mm/pti: Add Warning when booting on a PCID capable CPU
On Wed, Jul 11, 2018 at 4:29 AM, Joerg Roedel wrote: > From: Joerg Roedel > > Warn the user in case the performance can be significantly > improved by switching to a 64-bit kernel. ... > +#ifdef CONFIG_X86_32 > + if (boot_cpu_has(X86_FEATURE_PCID)) { I'm a bit confused. Wouldn't the setup_clear_cpu_cap() call in early_identify_cpu() prevent this from working? Boris, do we have a straightforward way to ask "does the CPU advertise this feature in CPUID regardless of whether we have it enabled right now"? --Andy
[PATCH 38/39] x86/mm/pti: Add Warning when booting on a PCID capable CPU
From: Joerg Roedel Warn the user in case the performance can be significantly improved by switching to a 64-bit kernel. Suggested-by: Andy Lutomirski Signed-off-by: Joerg Roedel --- arch/x86/mm/pti.c | 16 1 file changed, 16 insertions(+) diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c index b879ccd..e20283fa 100644 --- a/arch/x86/mm/pti.c +++ b/arch/x86/mm/pti.c @@ -517,6 +517,22 @@ void __init pti_init(void) pr_info("enabled\n"); +#ifdef CONFIG_X86_32 + if (boot_cpu_has(X86_FEATURE_PCID)) { + /* Use printk to work around pr_fmt() */ + printk(KERN_WARNING "\n"); + printk(KERN_WARNING "\n"); + printk(KERN_WARNING "** WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! **\n"); + printk(KERN_WARNING "** **\n"); + printk(KERN_WARNING "** You are using 32-bit PTI on a 64-bit PCID-capable CPU. **\n"); + printk(KERN_WARNING "** Your performance will increase dramatically if you **\n"); + printk(KERN_WARNING "** switch to a 64-bit kernel! **\n"); + printk(KERN_WARNING "** **\n"); + printk(KERN_WARNING "** WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! **\n"); + printk(KERN_WARNING "\n"); + } +#endif + pti_clone_user_shared(); /* Undo all global bits from the init pagetables in head_64.S: */ -- 2.7.4