linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches
@ 2009-02-08 14:58 Brian Gerst
  2009-02-08 14:58 ` [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load Brian Gerst
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Brian Gerst @ 2009-02-08 14:58 UTC (permalink / raw)
  To: Tejun Heo; +Cc: Ingo Molnar, linux-kernel

Impact: bug fix

IA-64 needs to put percpu data in the seperate section even on UP.
Fixes regression caused by "percpu: refactor percpu.h"

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Tony Luck <tony.luck@intel.com>
---
 arch/ia64/include/asm/percpu.h |    4 ++--
 include/linux/percpu.h         |    8 +++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/ia64/include/asm/percpu.h b/arch/ia64/include/asm/percpu.h
index 77f30b6..30cf465 100644
--- a/arch/ia64/include/asm/percpu.h
+++ b/arch/ia64/include/asm/percpu.h
@@ -27,12 +27,12 @@ extern void *per_cpu_init(void);
 
 #else /* ! SMP */
 
-#define PER_CPU_ATTRIBUTES	__attribute__((__section__(".data.percpu")))
-
 #define per_cpu_init()				(__phys_per_cpu_start)
 
 #endif	/* SMP */
 
+#define PER_CPU_BASE_SECTION ".data.percpu"
+
 /*
  * Be extremely careful when taking the address of this variable!  Due to virtual
  * remapping, it is different from the canonical address returned by __get_cpu_var(var)!
diff --git a/include/linux/percpu.h b/include/linux/percpu.h
index 0e24202..3577ffd 100644
--- a/include/linux/percpu.h
+++ b/include/linux/percpu.h
@@ -8,8 +8,15 @@
 
 #include <asm/percpu.h>
 
+#ifndef PER_CPU_BASE_SECTION
 #ifdef CONFIG_SMP
 #define PER_CPU_BASE_SECTION ".data.percpu"
+#else
+#define PER_CPU_BASE_SECTION ".data"
+#endif
+#endif
+
+#ifdef CONFIG_SMP
 
 #ifdef MODULE
 #define PER_CPU_SHARED_ALIGNED_SECTION ""
@@ -20,7 +27,6 @@
 
 #else
 
-#define PER_CPU_BASE_SECTION ".data"
 #define PER_CPU_SHARED_ALIGNED_SECTION ""
 #define PER_CPU_FIRST_SECTION ""
 
-- 
1.6.1


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

* [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load
  2009-02-08 14:58 [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Brian Gerst
@ 2009-02-08 14:58 ` Brian Gerst
  2009-02-09  9:29   ` Ingo Molnar
  2009-02-08 14:58 ` [PATCH 3/3] x86: Fix abuse of per_cpu_offset Brian Gerst
  2009-02-09  9:29 ` [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Ingo Molnar
  2 siblings, 1 reply; 7+ messages in thread
From: Brian Gerst @ 2009-02-08 14:58 UTC (permalink / raw)
  To: Tejun Heo; +Cc: Ingo Molnar, linux-kernel, Jiri Slaby

Impact: cleanup and bug fix

Use the linker to create symbols for certain per-cpu variables
that are offset by __per_cpu_load.  This allows the removal of
the runtime fixup of the GDT pointer, which fixes a bug with
resume reported by Jiri Slaby.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Cc: Jiri Slaby <jirislaby@gmail.com>
---
 arch/x86/include/asm/percpu.h    |   22 ++++++++++++++++++++++
 arch/x86/include/asm/processor.h |    2 ++
 arch/x86/kernel/cpu/common.c     |    6 +-----
 arch/x86/kernel/head_64.S        |   21 ++-------------------
 arch/x86/kernel/vmlinux_64.lds.S |    8 ++++++++
 5 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
index 0b64af4..aee103b 100644
--- a/arch/x86/include/asm/percpu.h
+++ b/arch/x86/include/asm/percpu.h
@@ -34,6 +34,12 @@
 #define PER_CPU_VAR(var)	per_cpu__##var
 #endif	/* SMP */
 
+#ifdef CONFIG_X86_64_SMP
+#define INIT_PER_CPU_VAR(var)  init_per_cpu__##var
+#else
+#define INIT_PER_CPU_VAR(var)  per_cpu__##var
+#endif
+
 #else /* ...!ASSEMBLY */
 
 #include <linux/stringify.h>
@@ -45,6 +51,22 @@
 #define __percpu_arg(x)		"%" #x
 #endif
 
+/*
+ * Initialized pointers to per-cpu variables needed for the boot
+ * processor need to use these macros to get the proper address
+ * offset from __per_cpu_load on SMP.
+ *
+ * There also must be an entry in vmlinux_64.lds.S
+ */
+#define DECLARE_INIT_PER_CPU(var) \
+       extern typeof(per_cpu_var(var)) init_per_cpu_var(var)
+
+#ifdef CONFIG_X86_64_SMP
+#define init_per_cpu_var(var)  init_per_cpu__##var
+#else
+#define init_per_cpu_var(var)  per_cpu_var(var)
+#endif
+
 /* For arch-specific code, we can use direct single-insn ops (they
  * don't give an lvalue though). */
 extern void __bad_percpu_size(void);
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 656d02e..373d3f6 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -393,6 +393,8 @@ union irq_stack_union {
 };
 
 DECLARE_PER_CPU(union irq_stack_union, irq_stack_union);
+DECLARE_INIT_PER_CPU(irq_stack_union);
+
 DECLARE_PER_CPU(char *, irq_stack_ptr);
 #endif
 
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 0f73ea4..41b0de6 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -902,12 +902,8 @@ struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table };
 
 DEFINE_PER_CPU_FIRST(union irq_stack_union,
 		     irq_stack_union) __aligned(PAGE_SIZE);
-#ifdef CONFIG_SMP
-DEFINE_PER_CPU(char *, irq_stack_ptr);	/* will be set during per cpu init */
-#else
 DEFINE_PER_CPU(char *, irq_stack_ptr) =
-	per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64;
-#endif
+	init_per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64;
 
 DEFINE_PER_CPU(unsigned long, kernel_stack) =
 	(unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE;
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index a0a2b5c..2e648e3 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -205,19 +205,6 @@ ENTRY(secondary_startup_64)
 	pushq $0
 	popfq
 
-#ifdef CONFIG_SMP
-	/*
-	 * Fix up static pointers that need __per_cpu_load added.  The assembler
-	 * is unable to do this directly.  This is only needed for the boot cpu.
-	 * These values are set up with the correct base addresses by C code for
-	 * secondary cpus.
-	 */
-	movq	initial_gs(%rip), %rax
-	cmpl	$0, per_cpu__cpu_number(%rax)
-	jne	1f
-	addq	%rax, early_gdt_descr_base(%rip)
-1:
-#endif
 	/*
 	 * We must switch to a new descriptor in kernel space for the GDT
 	 * because soon the kernel won't have access anymore to the userspace
@@ -275,11 +262,7 @@ ENTRY(secondary_startup_64)
 	ENTRY(initial_code)
 	.quad	x86_64_start_kernel
 	ENTRY(initial_gs)
-#ifdef CONFIG_SMP
-	.quad	__per_cpu_load
-#else
-	.quad	PER_CPU_VAR(irq_stack_union)
-#endif
+	.quad	INIT_PER_CPU_VAR(irq_stack_union)
 	__FINITDATA
 
 	ENTRY(stack_start)
@@ -425,7 +408,7 @@ NEXT_PAGE(level2_spare_pgt)
 early_gdt_descr:
 	.word	GDT_ENTRIES*8-1
 early_gdt_descr_base:
-	.quad	per_cpu__gdt_page
+	.quad	INIT_PER_CPU_VAR(gdt_page)
 
 ENTRY(phys_base)
 	/* This must match the first entry in level2_kernel_pgt */
diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S
index 07f62d2..087a7f2 100644
--- a/arch/x86/kernel/vmlinux_64.lds.S
+++ b/arch/x86/kernel/vmlinux_64.lds.S
@@ -257,6 +257,14 @@ SECTIONS
   DWARF_DEBUG
 }
 
+ /*
+  * Per-cpu symbols which need to be offset from __per_cpu_load
+  * for the boot processor.
+  */
+#define INIT_PER_CPU(x) init_per_cpu__##x = per_cpu__##x + __per_cpu_load
+INIT_PER_CPU(gdt_page);
+INIT_PER_CPU(irq_stack_union);
+
 /*
  * Build-time check on the image size:
  */
-- 
1.6.1


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

* [PATCH 3/3] x86: Fix abuse of per_cpu_offset
  2009-02-08 14:58 [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Brian Gerst
  2009-02-08 14:58 ` [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load Brian Gerst
@ 2009-02-08 14:58 ` Brian Gerst
  2009-02-09  9:31   ` Ingo Molnar
  2009-02-09  9:29 ` [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Ingo Molnar
  2 siblings, 1 reply; 7+ messages in thread
From: Brian Gerst @ 2009-02-08 14:58 UTC (permalink / raw)
  To: Tejun Heo; +Cc: Ingo Molnar, linux-kernel

Impact: bug fix

Don't use per_cpu_offset() to determine if it valid to access a
per-cpu variable for a given cpu number.  It is not a valid assumption
on x86-64 anymore.  Use cpu_possible() instead.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
---
 arch/x86/mm/numa_64.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c
index 08d140f..deb1c1a 100644
--- a/arch/x86/mm/numa_64.c
+++ b/arch/x86/mm/numa_64.c
@@ -702,7 +702,7 @@ void __cpuinit numa_set_node(int cpu, int node)
 	}
 
 #ifdef CONFIG_DEBUG_PER_CPU_MAPS
-	if (cpu >= nr_cpu_ids || !per_cpu_offset(cpu)) {
+	if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) {
 		printk(KERN_ERR "numa_set_node: invalid cpu# (%d)\n", cpu);
 		dump_stack();
 		return;
@@ -790,7 +790,7 @@ int early_cpu_to_node(int cpu)
 	if (early_per_cpu_ptr(x86_cpu_to_node_map))
 		return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu];
 
-	if (!per_cpu_offset(cpu)) {
+	if (!cpu_possible(cpu)) {
 		printk(KERN_WARNING
 			"early_cpu_to_node(%d): no per_cpu area!\n", cpu);
 		dump_stack();
-- 
1.6.1


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

* Re: [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches
  2009-02-08 14:58 [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Brian Gerst
  2009-02-08 14:58 ` [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load Brian Gerst
  2009-02-08 14:58 ` [PATCH 3/3] x86: Fix abuse of per_cpu_offset Brian Gerst
@ 2009-02-09  9:29 ` Ingo Molnar
  2 siblings, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2009-02-09  9:29 UTC (permalink / raw)
  To: Brian Gerst; +Cc: Tejun Heo, linux-kernel


* Brian Gerst <brgerst@gmail.com> wrote:

> Impact: bug fix
> 
> IA-64 needs to put percpu data in the seperate section even on UP.
> Fixes regression caused by "percpu: refactor percpu.h"
> 
> Signed-off-by: Brian Gerst <brgerst@gmail.com>
> Acked-by: Tony Luck <tony.luck@intel.com>
> ---
>  arch/ia64/include/asm/percpu.h |    4 ++--
>  include/linux/percpu.h         |    8 +++++++-
>  2 files changed, 9 insertions(+), 3 deletions(-)

Applied to tip/core/percpu, thanks!

	Ingo

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

* Re: [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load
  2009-02-08 14:58 ` [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load Brian Gerst
@ 2009-02-09  9:29   ` Ingo Molnar
  2009-02-11 22:53     ` Jiri Slaby
  0 siblings, 1 reply; 7+ messages in thread
From: Ingo Molnar @ 2009-02-09  9:29 UTC (permalink / raw)
  To: Brian Gerst; +Cc: Tejun Heo, linux-kernel, Jiri Slaby


* Brian Gerst <brgerst@gmail.com> wrote:

> Impact: cleanup and bug fix
> 
> Use the linker to create symbols for certain per-cpu variables
> that are offset by __per_cpu_load.  This allows the removal of
> the runtime fixup of the GDT pointer, which fixes a bug with
> resume reported by Jiri Slaby.
> 
> Signed-off-by: Brian Gerst <brgerst@gmail.com>
> Cc: Jiri Slaby <jirislaby@gmail.com>
> ---
>  arch/x86/include/asm/percpu.h    |   22 ++++++++++++++++++++++
>  arch/x86/include/asm/processor.h |    2 ++
>  arch/x86/kernel/cpu/common.c     |    6 +-----
>  arch/x86/kernel/head_64.S        |   21 ++-------------------
>  arch/x86/kernel/vmlinux_64.lds.S |    8 ++++++++
>  5 files changed, 35 insertions(+), 24 deletions(-)

applied to tip/core/percpu, thanks!

Also added these tags:

Reported-by: Jiri Slaby <jirislaby@gmail.com>
Acked-by: Jiri Slaby <jirislaby@gmail.com>

	Ingo

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

* Re: [PATCH 3/3] x86: Fix abuse of per_cpu_offset
  2009-02-08 14:58 ` [PATCH 3/3] x86: Fix abuse of per_cpu_offset Brian Gerst
@ 2009-02-09  9:31   ` Ingo Molnar
  0 siblings, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2009-02-09  9:31 UTC (permalink / raw)
  To: Brian Gerst; +Cc: Tejun Heo, linux-kernel, Thomas Gleixner, H. Peter Anvin


* Brian Gerst <brgerst@gmail.com> wrote:

> Impact: bug fix
> 
> Don't use per_cpu_offset() to determine if it valid to access a
> per-cpu variable for a given cpu number.  It is not a valid assumption
> on x86-64 anymore.  Use cpu_possible() instead.
> 
> Signed-off-by: Brian Gerst <brgerst@gmail.com>
> ---
>  arch/x86/mm/numa_64.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)

Applied to tip/core/perpcu, thanks Brian!

	Ingo

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

* Re: [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load
  2009-02-09  9:29   ` Ingo Molnar
@ 2009-02-11 22:53     ` Jiri Slaby
  0 siblings, 0 replies; 7+ messages in thread
From: Jiri Slaby @ 2009-02-11 22:53 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Brian Gerst, Tejun Heo, linux-kernel

On 02/09/2009 10:29 AM, Ingo Molnar wrote:
> * Brian Gerst <brgerst@gmail.com> wrote:
> 
>> Impact: cleanup and bug fix
>>
>> Use the linker to create symbols for certain per-cpu variables
>> that are offset by __per_cpu_load.  This allows the removal of
>> the runtime fixup of the GDT pointer, which fixes a bug with
>> resume reported by Jiri Slaby.
>>
>> Signed-off-by: Brian Gerst <brgerst@gmail.com>
>> Cc: Jiri Slaby <jirislaby@gmail.com>
>> ---
>>  arch/x86/include/asm/percpu.h    |   22 ++++++++++++++++++++++
>>  arch/x86/include/asm/processor.h |    2 ++
>>  arch/x86/kernel/cpu/common.c     |    6 +-----
>>  arch/x86/kernel/head_64.S        |   21 ++-------------------
>>  arch/x86/kernel/vmlinux_64.lds.S |    8 ++++++++
>>  5 files changed, 35 insertions(+), 24 deletions(-)
> 
> applied to tip/core/percpu, thanks!
> 
> Also added these tags:
> 
> Reported-by: Jiri Slaby <jirislaby@gmail.com>
> Acked-by: Jiri Slaby <jirislaby@gmail.com>

Ok, fixes the problem for me, thanks.

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

end of thread, other threads:[~2009-02-11 22:53 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-08 14:58 [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Brian Gerst
2009-02-08 14:58 ` [PATCH 2/3] x86: Use linker to offset symbols by __per_cpu_load Brian Gerst
2009-02-09  9:29   ` Ingo Molnar
2009-02-11 22:53     ` Jiri Slaby
2009-02-08 14:58 ` [PATCH 3/3] x86: Fix abuse of per_cpu_offset Brian Gerst
2009-02-09  9:31   ` Ingo Molnar
2009-02-09  9:29 ` [PATCH 1/3] percpu: Make PER_CPU_BASE_SECTION overridable by arches Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).