| From 6627a3a0fff6692a37d716806fb4bf3391d6aa3f Mon Sep 17 00:00:00 2001 |
| From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> |
| Date: Thu, 27 Jun 2019 19:35:36 -0700 |
| Subject: [PATCH] x86/cpu/intel: Clear cache self-snoop capability in CPUs with |
| known errata |
| |
| commit 1e03bff3600101bd9158d005e4313132e55bdec8 upstream. |
| |
| Processors which have self-snooping capability can handle conflicting |
| memory type across CPUs by snooping its own cache. However, there exists |
| CPU models in which having conflicting memory types still leads to |
| unpredictable behavior, machine check errors, or hangs. |
| |
| Clear this feature on affected CPUs to prevent its use. |
| |
| Suggested-by: Alan Cox <alan.cox@intel.com> |
| Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Borislav Petkov <bp@suse.de> |
| Cc: Tony Luck <tony.luck@intel.com> |
| Cc: "H. Peter Anvin" <hpa@zytor.com> |
| Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Cc: Andi Kleen <andi.kleen@intel.com> |
| Cc: Hans de Goede <hdegoede@redhat.com> |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: Jordan Borgner <mail@jordan-borgner.de> |
| Cc: "Ravi V. Shankar" <ravi.v.shankar@intel.com> |
| Cc: Mohammad Etemadi <mohammad.etemadi@intel.com> |
| Cc: Ricardo Neri <ricardo.neri@intel.com> |
| Cc: Andy Shevchenko <andriy.shevchenko@intel.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Peter Feiner <pfeiner@google.com> |
| Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> |
| Link: https://lkml.kernel.org/r/1561689337-19390-2-git-send-email-ricardo.neri-calderon@linux.intel.com |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c |
| index 92b107ab283f..cc9f24818e49 100644 |
| --- a/arch/x86/kernel/cpu/intel.c |
| +++ b/arch/x86/kernel/cpu/intel.c |
| @@ -66,6 +66,32 @@ void check_mpx_erratum(struct cpuinfo_x86 *c) |
| } |
| } |
| |
| +/* |
| + * Processors which have self-snooping capability can handle conflicting |
| + * memory type across CPUs by snooping its own cache. However, there exists |
| + * CPU models in which having conflicting memory types still leads to |
| + * unpredictable behavior, machine check errors, or hangs. Clear this |
| + * feature to prevent its use on machines with known erratas. |
| + */ |
| +static void check_memory_type_self_snoop_errata(struct cpuinfo_x86 *c) |
| +{ |
| + switch (c->x86_model) { |
| + case INTEL_FAM6_CORE_YONAH: |
| + case INTEL_FAM6_CORE2_MEROM: |
| + case INTEL_FAM6_CORE2_MEROM_L: |
| + case INTEL_FAM6_CORE2_PENRYN: |
| + case INTEL_FAM6_CORE2_DUNNINGTON: |
| + case INTEL_FAM6_NEHALEM: |
| + case INTEL_FAM6_NEHALEM_G: |
| + case INTEL_FAM6_NEHALEM_EP: |
| + case INTEL_FAM6_NEHALEM_EX: |
| + case INTEL_FAM6_WESTMERE: |
| + case INTEL_FAM6_WESTMERE_EP: |
| + case INTEL_FAM6_SANDYBRIDGE: |
| + setup_clear_cpu_cap(X86_FEATURE_SELFSNOOP); |
| + } |
| +} |
| + |
| static bool ring3mwait_disabled __read_mostly; |
| |
| static int __init ring3mwait_disable(char *__unused) |
| @@ -304,6 +330,7 @@ static void early_init_intel(struct cpuinfo_x86 *c) |
| } |
| |
| check_mpx_erratum(c); |
| + check_memory_type_self_snoop_errata(c); |
| |
| /* |
| * Get the number of SMT siblings early from the extended topology |
| -- |
| 2.7.4 |
| |