* [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
* 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 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
* [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 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 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
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