All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 00/01] Virtual memory size detection for 64 bit MIPS CPUs
@ 2010-02-02 16:52 Guenter Roeck
  2010-02-02 16:52 ` [PATCH v6 01/01] " Guenter Roeck
  2010-02-02 17:50 ` [PATCH v6 00/01] " Ralf Baechle
  0 siblings, 2 replies; 5+ messages in thread
From: Guenter Roeck @ 2010-02-02 16:52 UTC (permalink / raw)
  To: linux-mips


This patchset addresses some of the most recent comments.

It does not address changes to TASK_SIZE, and it does not address replacing
the VMALLOC_END macro with a variable. Those changes are non-trivial
and will require more discussion and/or clarification.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v6 01/01] Virtual memory size detection for 64 bit MIPS CPUs
  2010-02-02 16:52 [PATCH v6 00/01] Virtual memory size detection for 64 bit MIPS CPUs Guenter Roeck
@ 2010-02-02 16:52 ` Guenter Roeck
  2010-02-02 18:29   ` David Daney
  2010-02-02 17:50 ` [PATCH v6 00/01] " Ralf Baechle
  1 sibling, 1 reply; 5+ messages in thread
From: Guenter Roeck @ 2010-02-02 16:52 UTC (permalink / raw)
  To: linux-mips; +Cc: Guenter Roeck

Linux kernel 2.6.32 and later allocates memory from the top of virtual memory
space.

This patch implements virtual memory size detection for 64 bit MIPS CPUs
to avoid resulting crashes.

Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
---
 arch/mips/include/asm/cpu-features.h |    7 +++++++
 arch/mips/include/asm/cpu-info.h     |    3 +++
 arch/mips/include/asm/pgtable-64.h   |    4 +++-
 arch/mips/kernel/cpu-probe.c         |   11 +++++++++++
 4 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h
index 1f4df64..e5835dd 100644
--- a/arch/mips/include/asm/cpu-features.h
+++ b/arch/mips/include/asm/cpu-features.h
@@ -191,6 +191,9 @@
 # ifndef cpu_has_64bit_addresses
 # define cpu_has_64bit_addresses	0
 # endif
+# ifndef cpu_vmbits
+# define cpu_vmbits 31
+# endif
 #endif
 
 #ifdef CONFIG_64BIT
@@ -209,6 +212,10 @@
 # ifndef cpu_has_64bit_addresses
 # define cpu_has_64bit_addresses	1
 # endif
+# ifndef cpu_vmbits
+# define cpu_vmbits cpu_data[0].vmbits
+# define __NEED_VMBITS_PROBE
+# endif
 #endif
 
 #if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint)
diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h
index 1260443..b39def3 100644
--- a/arch/mips/include/asm/cpu-info.h
+++ b/arch/mips/include/asm/cpu-info.h
@@ -58,6 +58,9 @@ struct cpuinfo_mips {
 	struct cache_desc	tcache;	/* Tertiary/split secondary cache */
 	int			srsets;	/* Shadow register sets */
 	int			core;	/* physical core number */
+#ifdef CONFIG_64BIT
+	int			vmbits;	/* Virtual memory size in bits */
+#endif
 #if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
 	/*
 	 * In the MIPS MT "SMTC" model, each TC is considered
diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h
index 9cd5089..8eda30b 100644
--- a/arch/mips/include/asm/pgtable-64.h
+++ b/arch/mips/include/asm/pgtable-64.h
@@ -110,7 +110,9 @@
 #define VMALLOC_START		MAP_BASE
 #define VMALLOC_END	\
 	(VMALLOC_START + \
-	 PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32))
+	 min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
+	     (1UL << cpu_vmbits)) - (1UL << 32))
+
 #if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
 	VMALLOC_START != CKSSEG
 /* Load modules into 32bit-compatible segment. */
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index 7a51866..00d7124 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -282,6 +282,15 @@ static inline int __cpu_has_fpu(void)
 	return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE);
 }
 
+static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
+{
+#ifdef __NEED_VMBITS_PROBE
+	write_c0_entryhi(0x3ffffffffffff000ULL);
+	back_to_back_c0_hazard();
+	c->vmbits = fls64(read_c0_entryhi() & 0x3ffffffffffff000ULL);
+#endif
+}
+
 #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
 		| MIPS_CPU_COUNTER)
 
@@ -967,6 +976,8 @@ __cpuinit void cpu_probe(void)
 		c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
 	else
 		c->srsets = 1;
+
+	cpu_probe_vmbits(c);
 }
 
 __cpuinit void cpu_report(void)
-- 
1.6.0.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v6 00/01] Virtual memory size detection for 64 bit MIPS CPUs
  2010-02-02 16:52 [PATCH v6 00/01] Virtual memory size detection for 64 bit MIPS CPUs Guenter Roeck
  2010-02-02 16:52 ` [PATCH v6 01/01] " Guenter Roeck
@ 2010-02-02 17:50 ` Ralf Baechle
  1 sibling, 0 replies; 5+ messages in thread
From: Ralf Baechle @ 2010-02-02 17:50 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-mips

On Tue, Feb 02, 2010 at 08:52:19AM -0800, Guenter Roeck wrote:

> This patchset addresses some of the most recent comments.
> 
> It does not address changes to TASK_SIZE, and it does not address replacing
> the VMALLOC_END macro with a variable. Those changes are non-trivial
> and will require more discussion and/or clarification.

I think I'm happy with doing these in followup patches.  What's most
important is sorting the whole issue soon so we can release a working
2.6.33.

  Ralf

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v6 01/01] Virtual memory size detection for 64 bit MIPS CPUs
  2010-02-02 16:52 ` [PATCH v6 01/01] " Guenter Roeck
@ 2010-02-02 18:29   ` David Daney
  2010-02-02 18:49     ` Ralf Baechle
  0 siblings, 1 reply; 5+ messages in thread
From: David Daney @ 2010-02-02 18:29 UTC (permalink / raw)
  To: Guenter Roeck, Ralf Baechle; +Cc: linux-mips

Guenter Roeck wrote:
> Linux kernel 2.6.32 and later allocates memory from the top of virtual memory
> space.
> 
> This patch implements virtual memory size detection for 64 bit MIPS CPUs
> to avoid resulting crashes.
> 
> Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>

Reviewed-by: David Daney <ddaney@caviumnetworks.com>


> ---
>  arch/mips/include/asm/cpu-features.h |    7 +++++++
>  arch/mips/include/asm/cpu-info.h     |    3 +++
>  arch/mips/include/asm/pgtable-64.h   |    4 +++-
>  arch/mips/kernel/cpu-probe.c         |   11 +++++++++++
>  4 files changed, 24 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h
> index 1f4df64..e5835dd 100644
> --- a/arch/mips/include/asm/cpu-features.h
> +++ b/arch/mips/include/asm/cpu-features.h
> @@ -191,6 +191,9 @@
>  # ifndef cpu_has_64bit_addresses
>  # define cpu_has_64bit_addresses	0
>  # endif
> +# ifndef cpu_vmbits
> +# define cpu_vmbits 31
> +# endif
>  #endif
>  
>  #ifdef CONFIG_64BIT
> @@ -209,6 +212,10 @@
>  # ifndef cpu_has_64bit_addresses
>  # define cpu_has_64bit_addresses	1
>  # endif
> +# ifndef cpu_vmbits
> +# define cpu_vmbits cpu_data[0].vmbits
> +# define __NEED_VMBITS_PROBE
> +# endif
>  #endif
>  
>  #if defined(CONFIG_CPU_MIPSR2_IRQ_VI) && !defined(cpu_has_vint)
> diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h
> index 1260443..b39def3 100644
> --- a/arch/mips/include/asm/cpu-info.h
> +++ b/arch/mips/include/asm/cpu-info.h
> @@ -58,6 +58,9 @@ struct cpuinfo_mips {
>  	struct cache_desc	tcache;	/* Tertiary/split secondary cache */
>  	int			srsets;	/* Shadow register sets */
>  	int			core;	/* physical core number */
> +#ifdef CONFIG_64BIT
> +	int			vmbits;	/* Virtual memory size in bits */
> +#endif
>  #if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
>  	/*
>  	 * In the MIPS MT "SMTC" model, each TC is considered
> diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h
> index 9cd5089..8eda30b 100644
> --- a/arch/mips/include/asm/pgtable-64.h
> +++ b/arch/mips/include/asm/pgtable-64.h
> @@ -110,7 +110,9 @@
>  #define VMALLOC_START		MAP_BASE
>  #define VMALLOC_END	\
>  	(VMALLOC_START + \
> -	 PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE - (1UL << 32))
> +	 min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \
> +	     (1UL << cpu_vmbits)) - (1UL << 32))
> +
>  #if defined(CONFIG_MODULES) && defined(KBUILD_64BIT_SYM32) && \
>  	VMALLOC_START != CKSSEG
>  /* Load modules into 32bit-compatible segment. */
> diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
> index 7a51866..00d7124 100644
> --- a/arch/mips/kernel/cpu-probe.c
> +++ b/arch/mips/kernel/cpu-probe.c
> @@ -282,6 +282,15 @@ static inline int __cpu_has_fpu(void)
>  	return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE);
>  }
>  
> +static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
> +{
> +#ifdef __NEED_VMBITS_PROBE
> +	write_c0_entryhi(0x3ffffffffffff000ULL);
> +	back_to_back_c0_hazard();
> +	c->vmbits = fls64(read_c0_entryhi() & 0x3ffffffffffff000ULL);
> +#endif
> +}
> +
>  #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
>  		| MIPS_CPU_COUNTER)
>  
> @@ -967,6 +976,8 @@ __cpuinit void cpu_probe(void)
>  		c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
>  	else
>  		c->srsets = 1;
> +
> +	cpu_probe_vmbits(c);
>  }
>  
>  __cpuinit void cpu_report(void)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v6 01/01] Virtual memory size detection for 64 bit MIPS CPUs
  2010-02-02 18:29   ` David Daney
@ 2010-02-02 18:49     ` Ralf Baechle
  0 siblings, 0 replies; 5+ messages in thread
From: Ralf Baechle @ 2010-02-02 18:49 UTC (permalink / raw)
  To: David Daney; +Cc: Guenter Roeck, linux-mips

On Tue, Feb 02, 2010 at 10:29:25AM -0800, David Daney wrote:

> >Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
> 
> Reviewed-by: David Daney <ddaney@caviumnetworks.com>

Thanks for reviewing - as close as this to a release I appreciate a 2nd
pair of eyes.

Applied and will go to Linus asap.

Thanks everybody,

  Ralf

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-02-02 18:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-02 16:52 [PATCH v6 00/01] Virtual memory size detection for 64 bit MIPS CPUs Guenter Roeck
2010-02-02 16:52 ` [PATCH v6 01/01] " Guenter Roeck
2010-02-02 18:29   ` David Daney
2010-02-02 18:49     ` Ralf Baechle
2010-02-02 17:50 ` [PATCH v6 00/01] " Ralf Baechle

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.