NACK: [SRU][Bionic][PATCH 3/3] x86/speculation/l1tf: Increase l1tf memory limit for Nehalem+

Tyler Hicks tyhicks at canonical.com
Mon Sep 10 16:25:02 UTC 2018


On 09/10/2018 11:02 AM, Joseph Salisbury wrote:
> From: Andi Kleen <ak at linux.intel.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1789834
> 
> On Nehalem and newer core CPUs the CPU cache internally uses 44 bits
> physical address space. The L1TF workaround is limited by this internal
> cache address width, and needs to have one bit free there for the
> mitigation to work.
> 
> Older client systems report only 36bit physical address space so the range
> check decides that L1TF is not mitigated for a 36bit phys/32GB system with
> some memory holes.
> 
> But since these actually have the larger internal cache width this warning
> is bogus because it would only really be needed if the system had more than
> 43bits of memory.
> 
> Add a new internal x86_cache_bits field. Normally it is the same as the
> physical bits field reported by CPUID, but for Nehalem and newerforce it to
> be at least 44bits.
> 
> Change the L1TF memory size warning to use the new cache_bits field to
> avoid bogus warnings and remove the bogus comment about memory size.
> 
> Fixes: 17dbca119312 ("x86/speculation/l1tf: Add sysfs reporting for l1tf")
> Reported-by: George Anchev <studio at anchev.net>
> Reported-by: Christopher Snowhill <kode54 at gmail.com>
> Signed-off-by: Andi Kleen <ak at linux.intel.com>
> Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
> Cc: x86 at kernel.org
> Cc: linux-kernel at vger.kernel.org
> Cc: Michael Hocko <mhocko at suse.com>
> Cc: vbabka at suse.cz
> Cc: stable at vger.kernel.org
> Link: https://lkml.kernel.org/r/20180824170351.34874-1-andi@firstfloor.org
> 
> (backported from commit cc51e5428ea54f575d49cfcede1d4cb3a72b4ec4)
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> ---
>  arch/x86/include/asm/processor.h |  4 +++-
>  arch/x86/kernel/cpu/bugs.c       | 46 +++++++++++++++++++++++++++++++++++-----
>  2 files changed, 44 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index 8c770dd..49feba0 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -132,6 +132,8 @@ struct cpuinfo_x86 {
>  	/* Index into per_cpu list: */
>  	u16			cpu_index;
>  	u32			microcode;
> +	/* Address space bits used by the cache internally */
> +	u8			x86_cache_bits;
>  	unsigned		initialized : 1;
>  } __randomize_layout;
>  
> @@ -183,7 +185,7 @@ extern void cpu_detect(struct cpuinfo_x86 *c);
>  
>  static inline unsigned long long l1tf_pfn_limit(void)
>  {
> -	return BIT_ULL(boot_cpu_data.x86_phys_bits - 1 - PAGE_SHIFT);
> +	return BIT_ULL(boot_cpu_data.x86_cache_bits - 1 - PAGE_SHIFT);
>  }
>  
>  extern void early_cpu_init(void);
> diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
> index edfc64a..df9e418 100644
> --- a/arch/x86/kernel/cpu/bugs.c
> +++ b/arch/x86/kernel/cpu/bugs.c
> @@ -653,6 +653,45 @@ enum vmx_l1d_flush_state l1tf_vmx_mitigation = VMENTER_L1D_FLUSH_AUTO;
>  EXPORT_SYMBOL_GPL(l1tf_vmx_mitigation);
>  #endif
>  
> +/*
> + * These CPUs all support 44bits physical address space internally in the
> + * cache but CPUID can report a smaller number of physical address bits.
> + *
> + * The L1TF mitigation uses the top most address bit for the inversion of
> + * non present PTEs. When the installed memory reaches into the top most
> + * address bit due to memory holes, which has been observed on machines
> + * which report 36bits physical address bits and have 32G RAM installed,
> + * then the mitigation range check in l1tf_select_mitigation() triggers.
> + * This is a false positive because the mitigation is still possible due to
> + * the fact that the cache uses 44bit internally. Use the cache bits
> + * instead of the reported physical bits and adjust them on the affected
> + * machines to 44bit if the reported bits are less than 44.
> + */
> +static void override_cache_bits(struct cpuinfo_x86 *c)
> +{
> +	if (c->x86 != 6)
> +		return;
> +
> +	switch (c->x86_model) {
> +	case INTEL_FAM6_NEHALEM:
> +	case INTEL_FAM6_WESTMERE:
> +	case INTEL_FAM6_SANDYBRIDGE:
> +	case INTEL_FAM6_IVYBRIDGE:
> +	case INTEL_FAM6_HASWELL_CORE:
> +	case INTEL_FAM6_HASWELL_ULT:
> +	case INTEL_FAM6_HASWELL_GT3E:
> +	case INTEL_FAM6_BROADWELL_CORE:
> +	case INTEL_FAM6_BROADWELL_GT3E:
> +	case INTEL_FAM6_SKYLAKE_MOBILE:
> +	case INTEL_FAM6_SKYLAKE_DESKTOP:
> +	case INTEL_FAM6_KABYLAKE_MOBILE:
> +	case INTEL_FAM6_KABYLAKE_DESKTOP:
> +		if (c->x86_cache_bits < 44)
> +			c->x86_cache_bits = 44;

This backport is incorrect because it drops the assignment of
c->x86_cache_bits in get_cpu_address_sizes(). Without that assignment,
c->x86_cache_bits is left uninitialized in all cases except when the CPU
family is 6 and the model matches one of the ones listed above.

Tyler

> +		break;
> +	}
> +}
> +
>  static void __init l1tf_select_mitigation(void)
>  {
>  	u64 half_pa;
> @@ -660,6 +699,8 @@ static void __init l1tf_select_mitigation(void)
>  	if (!boot_cpu_has_bug(X86_BUG_L1TF))
>  		return;
>  
> +	override_cache_bits(&boot_cpu_data);
> +
>  	switch (l1tf_mitigation) {
>  	case L1TF_MITIGATION_OFF:
>  	case L1TF_MITIGATION_FLUSH_NOWARN:
> @@ -679,11 +720,6 @@ static void __init l1tf_select_mitigation(void)
>  	return;
>  #endif
>  
> -	/*
> -	 * This is extremely unlikely to happen because almost all
> -	 * systems have far more MAX_PA/2 than RAM can be fit into
> -	 * DIMM slots.
> -	 */
>  	half_pa = (u64)l1tf_pfn_limit() << PAGE_SHIFT;
>  	if (e820__mapped_any(half_pa, ULLONG_MAX - half_pa, E820_TYPE_RAM)) {
>  		pr_warn("System has more than MAX_PA/2 memory. L1TF mitigation not effective.\n");
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20180910/e620d4ff/attachment.sig>


More information about the kernel-team mailing list