lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sun, 8 Nov 2009 13:06:09 +0100
From:	Ingo Molnar <mingo@...e.hu>
To:	Jack Steiner <steiner@....com>, "H. Peter Anvin" <hpa@...or.com>
Cc:	tglx@...utronix.de, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] x86: UV SGI, Don't track GRU space in PAT


* Jack Steiner <steiner@....com> wrote:

> 
> GRU space is always mapped as WB in the page table. There is
> no need to track the mappings in the PAT. This also eliminates
> the "freeing invalid memtype" messages when the GRU space is unmapped.
> 
> Signed-off-by: Jack Steiner <steiner@....com>
> 
> ---
> 
> (resend of patch sent on 9/9. Seems to have fallen thru the cracks...)
> 
> 
>  arch/x86/include/asm/uv/uv.h       |    2 ++
>  arch/x86/kernel/apic/x2apic_uv_x.c |   11 ++++++++++-
>  arch/x86/mm/pat.c                  |    5 +++--
>  3 files changed, 15 insertions(+), 3 deletions(-)
> 
> Index: linux/arch/x86/include/asm/uv/uv.h
> ===================================================================
> --- linux.orig/arch/x86/include/asm/uv/uv.h	2009-10-05 08:12:09.000000000 -0500
> +++ linux/arch/x86/include/asm/uv/uv.h	2009-10-05 08:36:59.000000000 -0500
> @@ -8,6 +8,7 @@ struct mm_struct;
>  
>  #ifdef CONFIG_X86_UV
>  
> +extern int is_GRU_range(u64 start, u64 end);
>  extern enum uv_system_type get_uv_system_type(void);
>  extern int is_uv_system(void);
>  extern void uv_cpu_init(void);
> @@ -19,6 +20,7 @@ extern const struct cpumask *uv_flush_tl
>  
>  #else	/* X86_UV */
>  
> +static inline int is_GRU_range(u64 start, u64 end)	{ return 0; }
>  static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; }
>  static inline int is_uv_system(void)	{ return 0; }
>  static inline void uv_cpu_init(void)	{ }
> Index: linux/arch/x86/kernel/apic/x2apic_uv_x.c
> ===================================================================
> --- linux.orig/arch/x86/kernel/apic/x2apic_uv_x.c	2009-10-05 08:12:09.000000000 -0500
> +++ linux/arch/x86/kernel/apic/x2apic_uv_x.c	2009-10-05 08:36:59.000000000 -0500
> @@ -34,6 +34,7 @@
>  DEFINE_PER_CPU(int, x2apic_extra_bits);
>  
>  static enum uv_system_type uv_system_type;
> +static u64 gru_start_paddr, gru_end_paddr;
>  
>  static int early_get_nodeid(void)
>  {
> @@ -68,6 +69,11 @@ enum uv_system_type get_uv_system_type(v
>  	return uv_system_type;
>  }
>  
> +int is_GRU_range(u64 start, u64 end)
> +{
> +	return start >= gru_start_paddr && end < gru_end_paddr;
> +}
> +
>  int is_uv_system(void)
>  {
>  	return uv_system_type != UV_NONE;
> @@ -385,8 +391,11 @@ static __init void map_gru_high(int max_
>  	int shift = UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT;
>  
>  	gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR);
> -	if (gru.s.enable)
> +	if (gru.s.enable) {
>  		map_high("GRU", gru.s.base, shift, max_pnode, map_wb);
> +		gru_start_paddr = ((u64)gru.s.base << shift);
> +		gru_end_paddr = gru_start_paddr + (1UL << shift) * (max_pnode + 1);
> +	}
>  }
>  
>  static __init void map_mmr_high(int max_pnode)
> Index: linux/arch/x86/mm/pat.c
> ===================================================================
> --- linux.orig/arch/x86/mm/pat.c	2009-10-05 08:12:09.000000000 -0500
> +++ linux/arch/x86/mm/pat.c	2009-10-05 08:36:59.000000000 -0500
> @@ -28,6 +28,7 @@
>  #include <asm/msr.h>
>  #include <asm/pat.h>
>  #include <asm/io.h>
> +#include <asm/uv/uv.h>
>  
>  #ifdef CONFIG_X86_PAT
>  int __read_mostly pat_enabled = 1;
> @@ -388,7 +389,7 @@ int reserve_memtype(u64 start, u64 end, 
>  	}
>  
>  	/* Low ISA region is always mapped WB in page table. No need to track */
> -	if (is_ISA_range(start, end - 1)) {
> +	if (is_ISA_range(start, end - 1) || is_GRU_range(start, end - 1)) {
>  		if (new_type)
>  			*new_type = _PAGE_CACHE_WB;
>  		return 0;
> @@ -499,7 +500,7 @@ int free_memtype(u64 start, u64 end)
>  		return 0;
>  
>  	/* Low ISA region is always mapped WB. No need to track */
> -	if (is_ISA_range(start, end - 1))
> +	if (is_ISA_range(start, end - 1) || is_GRU_range(start, end - 1))
>  		return 0;

Hm, that's quite ugly - we used to have is_ISA_range() exceptions, now 
is_GRU_range() is added too.

We should instead have an x86_platform vector for PAT exceptions, which 
SGI/UV (and ISA) would fill in automatically, agreed?

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ