@@ -4182,6 +4182,8 @@
nomodule Disable module load
+ noinvlpgb [X86-64,EARLY] Disable the INVLPGB cpu feature.
+
nonmi_ipi [X86] Disable using NMI IPIs during panic/reboot to
shutdown the other cpus. Instead use the REBOOT_VECTOR
irq.
@@ -4190,6 +4192,7 @@
pagetables) support.
nopcid [X86-64,EARLY] Disable the PCID cpu feature.
+ This also disables INVLPGB, which relies on PCID.
nopku [X86] Disable Memory Protection Keys CPU feature found
in some Intel CPUs.
@@ -245,6 +245,33 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
} };
EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
+#ifdef CONFIG_X86_BROADCAST_TLB_FLUSH
+static void disable_invlpgb(void)
+{
+ /* do not emit a message if the feature is not present */
+ if (!boot_cpu_has(X86_FEATURE_INVLPGB))
+ return;
+
+ setup_clear_cpu_cap(X86_FEATURE_INVLPGB);
+ pr_info("INVLPGB feature disabled\n");
+}
+
+static int __init x86_noinvlpgb_setup(char *s)
+{
+ /* noinvlpgb doesn't accept parameters */
+ if (s)
+ return -EINVAL;
+
+ disable_invlpgb();
+ return 0;
+}
+early_param("noinvlpgb", x86_noinvlpgb_setup);
+#else
+static void disable_invlpgb(void)
+{
+}
+#endif
+
#ifdef CONFIG_X86_64
static int __init x86_nopcid_setup(char *s)
{
@@ -258,6 +285,7 @@ static int __init x86_nopcid_setup(char *s)
setup_clear_cpu_cap(X86_FEATURE_PCID);
pr_info("nopcid: PCID feature disabled\n");
+ disable_invlpgb();
return 0;
}
early_param("nopcid", x86_nopcid_setup);
Add a "noinvlpgb" commandline option to disable AMD broadcast TLB flushing at boot time. Also fix up the "nopcid" boot option to automatically disable INVLPGB functionality, which relies on processes to run on globally allocated PCIDs. Signed-off-by: Rik van Riel <riel@surriel.com> Suggested-by: Brendan Jackman <jackmanb@google.com> --- .../admin-guide/kernel-parameters.txt | 3 ++ arch/x86/kernel/cpu/common.c | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+)