diff options
Diffstat (limited to 'arch')
41 files changed, 75 insertions, 145 deletions
diff --git a/arch/alpha/include/asm/percpu.h b/arch/alpha/include/asm/percpu.h index b663f1f10b6a..2c12378e3aa9 100644 --- a/arch/alpha/include/asm/percpu.h +++ b/arch/alpha/include/asm/percpu.h | |||
@@ -1,102 +1,18 @@ | |||
1 | #ifndef __ALPHA_PERCPU_H | 1 | #ifndef __ALPHA_PERCPU_H |
2 | #define __ALPHA_PERCPU_H | 2 | #define __ALPHA_PERCPU_H |
3 | 3 | ||
4 | #include <linux/compiler.h> | ||
5 | #include <linux/threads.h> | ||
6 | #include <linux/percpu-defs.h> | ||
7 | |||
8 | /* | ||
9 | * Determine the real variable name from the name visible in the | ||
10 | * kernel sources. | ||
11 | */ | ||
12 | #define per_cpu_var(var) per_cpu__##var | ||
13 | |||
14 | #ifdef CONFIG_SMP | ||
15 | |||
16 | /* | ||
17 | * per_cpu_offset() is the offset that has to be added to a | ||
18 | * percpu variable to get to the instance for a certain processor. | ||
19 | */ | ||
20 | extern unsigned long __per_cpu_offset[NR_CPUS]; | ||
21 | |||
22 | #define per_cpu_offset(x) (__per_cpu_offset[x]) | ||
23 | |||
24 | #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id()) | ||
25 | #ifdef CONFIG_DEBUG_PREEMPT | ||
26 | #define my_cpu_offset per_cpu_offset(smp_processor_id()) | ||
27 | #else | ||
28 | #define my_cpu_offset __my_cpu_offset | ||
29 | #endif | ||
30 | |||
31 | #ifndef MODULE | ||
32 | #define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset)) | ||
33 | #define PER_CPU_DEF_ATTRIBUTES | ||
34 | #else | ||
35 | /* | 4 | /* |
36 | * To calculate addresses of locally defined variables, GCC uses 32-bit | 5 | * To calculate addresses of locally defined variables, GCC uses |
37 | * displacement from the GP. Which doesn't work for per cpu variables in | 6 | * 32-bit displacement from the GP. Which doesn't work for per cpu |
38 | * modules, as an offset to the kernel per cpu area is way above 4G. | 7 | * variables in modules, as an offset to the kernel per cpu area is |
8 | * way above 4G. | ||
39 | * | 9 | * |
40 | * This forces allocation of a GOT entry for per cpu variable using | 10 | * Always use weak definitions for percpu variables in modules. |
41 | * ldq instruction with a 'literal' relocation. | ||
42 | */ | ||
43 | #define SHIFT_PERCPU_PTR(var, offset) ({ \ | ||
44 | extern int simple_identifier_##var(void); \ | ||
45 | unsigned long __ptr, tmp_gp; \ | ||
46 | asm ( "br %1, 1f \n\ | ||
47 | 1: ldgp %1, 0(%1) \n\ | ||
48 | ldq %0, per_cpu__" #var"(%1)\t!literal" \ | ||
49 | : "=&r"(__ptr), "=&r"(tmp_gp)); \ | ||
50 | (typeof(&per_cpu_var(var)))(__ptr + (offset)); }) | ||
51 | |||
52 | #define PER_CPU_DEF_ATTRIBUTES __used | ||
53 | |||
54 | #endif /* MODULE */ | ||
55 | |||
56 | /* | ||
57 | * A percpu variable may point to a discarded regions. The following are | ||
58 | * established ways to produce a usable pointer from the percpu variable | ||
59 | * offset. | ||
60 | */ | 11 | */ |
61 | #define per_cpu(var, cpu) \ | 12 | #if defined(MODULE) && defined(CONFIG_SMP) |
62 | (*SHIFT_PERCPU_PTR(var, per_cpu_offset(cpu))) | 13 | #define ARCH_NEEDS_WEAK_PER_CPU |
63 | #define __get_cpu_var(var) \ | ||
64 | (*SHIFT_PERCPU_PTR(var, my_cpu_offset)) | ||
65 | #define __raw_get_cpu_var(var) \ | ||
66 | (*SHIFT_PERCPU_PTR(var, __my_cpu_offset)) | ||
67 | |||
68 | #else /* ! SMP */ | ||
69 | |||
70 | #define per_cpu(var, cpu) (*((void)(cpu), &per_cpu_var(var))) | ||
71 | #define __get_cpu_var(var) per_cpu_var(var) | ||
72 | #define __raw_get_cpu_var(var) per_cpu_var(var) | ||
73 | |||
74 | #define PER_CPU_DEF_ATTRIBUTES | ||
75 | |||
76 | #endif /* SMP */ | ||
77 | |||
78 | #ifdef CONFIG_SMP | ||
79 | #define PER_CPU_BASE_SECTION ".data.percpu" | ||
80 | #else | ||
81 | #define PER_CPU_BASE_SECTION ".data" | ||
82 | #endif | ||
83 | |||
84 | #ifdef CONFIG_SMP | ||
85 | |||
86 | #ifdef MODULE | ||
87 | #define PER_CPU_SHARED_ALIGNED_SECTION "" | ||
88 | #else | ||
89 | #define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned" | ||
90 | #endif | ||
91 | #define PER_CPU_FIRST_SECTION ".first" | ||
92 | |||
93 | #else | ||
94 | |||
95 | #define PER_CPU_SHARED_ALIGNED_SECTION "" | ||
96 | #define PER_CPU_FIRST_SECTION "" | ||
97 | |||
98 | #endif | 14 | #endif |
99 | 15 | ||
100 | #define PER_CPU_ATTRIBUTES | 16 | #include <asm-generic/percpu.h> |
101 | 17 | ||
102 | #endif /* __ALPHA_PERCPU_H */ | 18 | #endif /* __ALPHA_PERCPU_H */ |
diff --git a/arch/alpha/include/asm/tlbflush.h b/arch/alpha/include/asm/tlbflush.h index 9d87aaa08c0d..e89e0c2e15b1 100644 --- a/arch/alpha/include/asm/tlbflush.h +++ b/arch/alpha/include/asm/tlbflush.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _ALPHA_TLBFLUSH_H | 2 | #define _ALPHA_TLBFLUSH_H |
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
5 | #include <linux/sched.h> | ||
5 | #include <asm/compiler.h> | 6 | #include <asm/compiler.h> |
6 | #include <asm/pgalloc.h> | 7 | #include <asm/pgalloc.h> |
7 | 8 | ||
diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index b9d6568e5f7f..75fe1d6877e9 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S | |||
@@ -139,6 +139,7 @@ SECTIONS | |||
139 | EXIT_TEXT | 139 | EXIT_TEXT |
140 | EXIT_DATA | 140 | EXIT_DATA |
141 | *(.exitcall.exit) | 141 | *(.exitcall.exit) |
142 | *(.discard) | ||
142 | } | 143 | } |
143 | 144 | ||
144 | .mdebug 0 : { | 145 | .mdebug 0 : { |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 69371028a202..5cc4812c9763 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -83,6 +83,7 @@ SECTIONS | |||
83 | EXIT_TEXT | 83 | EXIT_TEXT |
84 | EXIT_DATA | 84 | EXIT_DATA |
85 | *(.exitcall.exit) | 85 | *(.exitcall.exit) |
86 | *(.discard) | ||
86 | *(.ARM.exidx.exit.text) | 87 | *(.ARM.exidx.exit.text) |
87 | *(.ARM.extab.exit.text) | 88 | *(.ARM.extab.exit.text) |
88 | #ifndef CONFIG_HOTPLUG_CPU | 89 | #ifndef CONFIG_HOTPLUG_CPU |
diff --git a/arch/avr32/kernel/vmlinux.lds.S b/arch/avr32/kernel/vmlinux.lds.S index 7910d41eb886..b8324608ec0c 100644 --- a/arch/avr32/kernel/vmlinux.lds.S +++ b/arch/avr32/kernel/vmlinux.lds.S | |||
@@ -131,6 +131,7 @@ SECTIONS | |||
131 | /DISCARD/ : { | 131 | /DISCARD/ : { |
132 | EXIT_DATA | 132 | EXIT_DATA |
133 | *(.exitcall.exit) | 133 | *(.exitcall.exit) |
134 | *(.discard) | ||
134 | } | 135 | } |
135 | 136 | ||
136 | DWARF_DEBUG | 137 | DWARF_DEBUG |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index 6ac307ca0d80..6e8eabd8f0a6 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
@@ -280,5 +280,6 @@ SECTIONS | |||
280 | /DISCARD/ : | 280 | /DISCARD/ : |
281 | { | 281 | { |
282 | *(.exitcall.exit) | 282 | *(.exitcall.exit) |
283 | *(.discard) | ||
283 | } | 284 | } |
284 | } | 285 | } |
diff --git a/arch/blackfin/mm/sram-alloc.c b/arch/blackfin/mm/sram-alloc.c index 0bc3c4ef0aad..99e4dbb1dfd1 100644 --- a/arch/blackfin/mm/sram-alloc.c +++ b/arch/blackfin/mm/sram-alloc.c | |||
@@ -42,9 +42,9 @@ | |||
42 | #include <asm/mem_map.h> | 42 | #include <asm/mem_map.h> |
43 | #include "blackfin_sram.h" | 43 | #include "blackfin_sram.h" |
44 | 44 | ||
45 | static DEFINE_PER_CPU(spinlock_t, l1sram_lock) ____cacheline_aligned_in_smp; | 45 | static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1sram_lock); |
46 | static DEFINE_PER_CPU(spinlock_t, l1_data_sram_lock) ____cacheline_aligned_in_smp; | 46 | static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_data_sram_lock); |
47 | static DEFINE_PER_CPU(spinlock_t, l1_inst_sram_lock) ____cacheline_aligned_in_smp; | 47 | static DEFINE_PER_CPU_SHARED_ALIGNED(spinlock_t, l1_inst_sram_lock); |
48 | static spinlock_t l2_sram_lock ____cacheline_aligned_in_smp; | 48 | static spinlock_t l2_sram_lock ____cacheline_aligned_in_smp; |
49 | 49 | ||
50 | /* the data structure for L1 scratchpad and DATA SRAM */ | 50 | /* the data structure for L1 scratchpad and DATA SRAM */ |
diff --git a/arch/cris/include/asm/mmu_context.h b/arch/cris/include/asm/mmu_context.h index 72ba08dcfd18..1d45fd6365b7 100644 --- a/arch/cris/include/asm/mmu_context.h +++ b/arch/cris/include/asm/mmu_context.h | |||
@@ -17,7 +17,8 @@ extern void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
17 | * registers like cr3 on the i386 | 17 | * registers like cr3 on the i386 |
18 | */ | 18 | */ |
19 | 19 | ||
20 | extern volatile DEFINE_PER_CPU(pgd_t *,current_pgd); /* defined in arch/cris/mm/fault.c */ | 20 | /* defined in arch/cris/mm/fault.c */ |
21 | DECLARE_PER_CPU(pgd_t *, current_pgd); | ||
21 | 22 | ||
22 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | 23 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) |
23 | { | 24 | { |
diff --git a/arch/cris/kernel/vmlinux.lds.S b/arch/cris/kernel/vmlinux.lds.S index 0d2adfc794d4..a3175ebb38cc 100644 --- a/arch/cris/kernel/vmlinux.lds.S +++ b/arch/cris/kernel/vmlinux.lds.S | |||
@@ -145,6 +145,7 @@ SECTIONS | |||
145 | EXIT_TEXT | 145 | EXIT_TEXT |
146 | EXIT_DATA | 146 | EXIT_DATA |
147 | *(.exitcall.exit) | 147 | *(.exitcall.exit) |
148 | *(.discard) | ||
148 | } | 149 | } |
149 | 150 | ||
150 | dram_end = dram_start + (CONFIG_ETRAX_DRAM_SIZE - __CONFIG_ETRAX_VMEM_SIZE)*1024*1024; | 151 | dram_end = dram_start + (CONFIG_ETRAX_DRAM_SIZE - __CONFIG_ETRAX_VMEM_SIZE)*1024*1024; |
diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c index f925115e3250..4a7cdd9ea1ee 100644 --- a/arch/cris/mm/fault.c +++ b/arch/cris/mm/fault.c | |||
@@ -29,7 +29,7 @@ extern void die_if_kernel(const char *, struct pt_regs *, long); | |||
29 | 29 | ||
30 | /* current active page directory */ | 30 | /* current active page directory */ |
31 | 31 | ||
32 | volatile DEFINE_PER_CPU(pgd_t *,current_pgd); | 32 | DEFINE_PER_CPU(pgd_t *, current_pgd); |
33 | unsigned long cris_signal_return_page; | 33 | unsigned long cris_signal_return_page; |
34 | 34 | ||
35 | /* | 35 | /* |
diff --git a/arch/frv/kernel/vmlinux.lds.S b/arch/frv/kernel/vmlinux.lds.S index 22d9787406ed..64b5a5e4d35e 100644 --- a/arch/frv/kernel/vmlinux.lds.S +++ b/arch/frv/kernel/vmlinux.lds.S | |||
@@ -177,6 +177,8 @@ SECTIONS | |||
177 | .debug_ranges 0 : { *(.debug_ranges) } | 177 | .debug_ranges 0 : { *(.debug_ranges) } |
178 | 178 | ||
179 | .comment 0 : { *(.comment) } | 179 | .comment 0 : { *(.comment) } |
180 | |||
181 | /DISCARD/ : { *(.discard) } | ||
180 | } | 182 | } |
181 | 183 | ||
182 | __kernel_image_size_no_bss = __bss_start - __kernel_image_start; | 184 | __kernel_image_size_no_bss = __bss_start - __kernel_image_start; |
diff --git a/arch/h8300/kernel/vmlinux.lds.S b/arch/h8300/kernel/vmlinux.lds.S index 43a87b9085b6..03d6c0df33db 100644 --- a/arch/h8300/kernel/vmlinux.lds.S +++ b/arch/h8300/kernel/vmlinux.lds.S | |||
@@ -154,6 +154,7 @@ SECTIONS | |||
154 | } | 154 | } |
155 | /DISCARD/ : { | 155 | /DISCARD/ : { |
156 | *(.exitcall.exit) | 156 | *(.exitcall.exit) |
157 | *(.discard) | ||
157 | } | 158 | } |
158 | .romfs : | 159 | .romfs : |
159 | { | 160 | { |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 170042b420d4..328d2f8b8c3f 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -89,6 +89,9 @@ config GENERIC_TIME_VSYSCALL | |||
89 | bool | 89 | bool |
90 | default y | 90 | default y |
91 | 91 | ||
92 | config HAVE_LEGACY_PER_CPU_AREA | ||
93 | def_bool y | ||
94 | |||
92 | config HAVE_SETUP_PER_CPU_AREA | 95 | config HAVE_SETUP_PER_CPU_AREA |
93 | def_bool y | 96 | def_bool y |
94 | 97 | ||
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index f0c521b0ba4c..93ebfea43c6c 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
@@ -58,7 +58,8 @@ static struct local_tlb_flush_counts { | |||
58 | unsigned int count; | 58 | unsigned int count; |
59 | } __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS]; | 59 | } __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS]; |
60 | 60 | ||
61 | static DEFINE_PER_CPU(unsigned short, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned; | 61 | static DEFINE_PER_CPU_SHARED_ALIGNED(unsigned short [NR_CPUS], |
62 | shadow_flush_counts); | ||
62 | 63 | ||
63 | #define IPI_CALL_FUNC 0 | 64 | #define IPI_CALL_FUNC 0 |
64 | #define IPI_CPU_STOP 1 | 65 | #define IPI_CPU_STOP 1 |
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index 4a95e86b9ac2..13d958975874 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
@@ -29,6 +29,7 @@ SECTIONS | |||
29 | EXIT_TEXT | 29 | EXIT_TEXT |
30 | EXIT_DATA | 30 | EXIT_DATA |
31 | *(.exitcall.exit) | 31 | *(.exitcall.exit) |
32 | *(.discard) | ||
32 | *(.IA_64.unwind.exit.text) | 33 | *(.IA_64.unwind.exit.text) |
33 | *(.IA_64.unwind_info.exit.text) | 34 | *(.IA_64.unwind_info.exit.text) |
34 | } | 35 | } |
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index e456f062f241..ece1bf994499 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
@@ -71,7 +71,7 @@ EXPORT_SYMBOL(sn_rtc_cycles_per_second); | |||
71 | DEFINE_PER_CPU(struct sn_hub_info_s, __sn_hub_info); | 71 | DEFINE_PER_CPU(struct sn_hub_info_s, __sn_hub_info); |
72 | EXPORT_PER_CPU_SYMBOL(__sn_hub_info); | 72 | EXPORT_PER_CPU_SYMBOL(__sn_hub_info); |
73 | 73 | ||
74 | DEFINE_PER_CPU(short, __sn_cnodeid_to_nasid[MAX_COMPACT_NODES]); | 74 | DEFINE_PER_CPU(short [MAX_COMPACT_NODES], __sn_cnodeid_to_nasid); |
75 | EXPORT_PER_CPU_SYMBOL(__sn_cnodeid_to_nasid); | 75 | EXPORT_PER_CPU_SYMBOL(__sn_cnodeid_to_nasid); |
76 | 76 | ||
77 | DEFINE_PER_CPU(struct nodepda_s *, __sn_nodepda); | 77 | DEFINE_PER_CPU(struct nodepda_s *, __sn_nodepda); |
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index 4179adf6c624..480a49944cfd 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S | |||
@@ -125,6 +125,7 @@ SECTIONS | |||
125 | EXIT_TEXT | 125 | EXIT_TEXT |
126 | EXIT_DATA | 126 | EXIT_DATA |
127 | *(.exitcall.exit) | 127 | *(.exitcall.exit) |
128 | *(.discard) | ||
128 | } | 129 | } |
129 | 130 | ||
130 | /* Stabs debugging sections. */ | 131 | /* Stabs debugging sections. */ |
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds index 01d212bb05a6..905a797ada93 100644 --- a/arch/m68k/kernel/vmlinux-std.lds +++ b/arch/m68k/kernel/vmlinux-std.lds | |||
@@ -87,6 +87,7 @@ SECTIONS | |||
87 | EXIT_TEXT | 87 | EXIT_TEXT |
88 | EXIT_DATA | 88 | EXIT_DATA |
89 | *(.exitcall.exit) | 89 | *(.exitcall.exit) |
90 | *(.discard) | ||
90 | } | 91 | } |
91 | 92 | ||
92 | /* Stabs debugging sections. */ | 93 | /* Stabs debugging sections. */ |
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index c192f773db96..47d04be322aa 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds | |||
@@ -82,6 +82,7 @@ __init_begin = .; | |||
82 | EXIT_TEXT | 82 | EXIT_TEXT |
83 | EXIT_DATA | 83 | EXIT_DATA |
84 | *(.exitcall.exit) | 84 | *(.exitcall.exit) |
85 | *(.discard) | ||
85 | } | 86 | } |
86 | 87 | ||
87 | .crap : { | 88 | .crap : { |
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index b7fe505e358d..68111a61a77f 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S | |||
@@ -188,6 +188,7 @@ SECTIONS { | |||
188 | EXIT_TEXT | 188 | EXIT_TEXT |
189 | EXIT_DATA | 189 | EXIT_DATA |
190 | *(.exitcall.exit) | 190 | *(.exitcall.exit) |
191 | *(.discard) | ||
191 | } | 192 | } |
192 | 193 | ||
193 | .bss : { | 194 | .bss : { |
diff --git a/arch/microblaze/kernel/vmlinux.lds.S b/arch/microblaze/kernel/vmlinux.lds.S index d34d38dcd12c..a207543c5927 100644 --- a/arch/microblaze/kernel/vmlinux.lds.S +++ b/arch/microblaze/kernel/vmlinux.lds.S | |||
@@ -162,4 +162,6 @@ SECTIONS { | |||
162 | } | 162 | } |
163 | . = ALIGN(4096); | 163 | . = ALIGN(4096); |
164 | _end = .; | 164 | _end = .; |
165 | |||
166 | /DISCARD/ : { *(.discard) } | ||
165 | } | 167 | } |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 58738c8d754f..45901609b741 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -179,6 +179,7 @@ SECTIONS | |||
179 | /* Sections to be discarded */ | 179 | /* Sections to be discarded */ |
180 | /DISCARD/ : { | 180 | /DISCARD/ : { |
181 | *(.exitcall.exit) | 181 | *(.exitcall.exit) |
182 | *(.discard) | ||
182 | 183 | ||
183 | /* ABI crap starts here */ | 184 | /* ABI crap starts here */ |
184 | *(.MIPS.options) | 185 | *(.MIPS.options) |
diff --git a/arch/mn10300/kernel/vmlinux.lds.S b/arch/mn10300/kernel/vmlinux.lds.S index bcebcefb4ad7..5609d4962a55 100644 --- a/arch/mn10300/kernel/vmlinux.lds.S +++ b/arch/mn10300/kernel/vmlinux.lds.S | |||
@@ -118,6 +118,7 @@ SECTIONS | |||
118 | /* Sections to be discarded */ | 118 | /* Sections to be discarded */ |
119 | /DISCARD/ : { | 119 | /DISCARD/ : { |
120 | EXIT_CALL | 120 | EXIT_CALL |
121 | *(.discard) | ||
121 | } | 122 | } |
122 | 123 | ||
123 | STABS_DEBUG | 124 | STABS_DEBUG |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index fd2cc4fd2b65..ccf58341845a 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -240,6 +240,7 @@ SECTIONS | |||
240 | /* Sections to be discarded */ | 240 | /* Sections to be discarded */ |
241 | /DISCARD/ : { | 241 | /DISCARD/ : { |
242 | *(.exitcall.exit) | 242 | *(.exitcall.exit) |
243 | *(.discard) | ||
243 | #ifdef CONFIG_64BIT | 244 | #ifdef CONFIG_64BIT |
244 | /* temporary hack until binutils is fixed to not emit these | 245 | /* temporary hack until binutils is fixed to not emit these |
245 | * for static binaries | 246 | * for static binaries |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index d00131ca0835..61bbffa2fe60 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -46,6 +46,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ | |||
46 | bool | 46 | bool |
47 | default y | 47 | default y |
48 | 48 | ||
49 | config HAVE_LEGACY_PER_CPU_AREA | ||
50 | def_bool PPC64 | ||
51 | |||
49 | config HAVE_SETUP_PER_CPU_AREA | 52 | config HAVE_SETUP_PER_CPU_AREA |
50 | def_bool PPC64 | 53 | def_bool PPC64 |
51 | 54 | ||
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 8ef8a14abc95..7fca9355fd3d 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -40,6 +40,7 @@ SECTIONS | |||
40 | /* Sections to be discarded. */ | 40 | /* Sections to be discarded. */ |
41 | /DISCARD/ : { | 41 | /DISCARD/ : { |
42 | *(.exitcall.exit) | 42 | *(.exitcall.exit) |
43 | *(.discard) | ||
43 | EXIT_DATA | 44 | EXIT_DATA |
44 | } | 45 | } |
45 | 46 | ||
diff --git a/arch/powerpc/mm/stab.c b/arch/powerpc/mm/stab.c index 98cd1dc2ae75..6e9b69c99856 100644 --- a/arch/powerpc/mm/stab.c +++ b/arch/powerpc/mm/stab.c | |||
@@ -31,7 +31,7 @@ struct stab_entry { | |||
31 | 31 | ||
32 | #define NR_STAB_CACHE_ENTRIES 8 | 32 | #define NR_STAB_CACHE_ENTRIES 8 |
33 | static DEFINE_PER_CPU(long, stab_cache_ptr); | 33 | static DEFINE_PER_CPU(long, stab_cache_ptr); |
34 | static DEFINE_PER_CPU(long, stab_cache[NR_STAB_CACHE_ENTRIES]); | 34 | static DEFINE_PER_CPU(long [NR_STAB_CACHE_ENTRIES], stab_cache); |
35 | 35 | ||
36 | /* | 36 | /* |
37 | * Create a segment table entry for the given esid/vsid pair. | 37 | * Create a segment table entry for the given esid/vsid pair. |
diff --git a/arch/powerpc/platforms/ps3/smp.c b/arch/powerpc/platforms/ps3/smp.c index f6e04bcc70ef..51ffde40af2b 100644 --- a/arch/powerpc/platforms/ps3/smp.c +++ b/arch/powerpc/platforms/ps3/smp.c | |||
@@ -37,7 +37,7 @@ | |||
37 | */ | 37 | */ |
38 | 38 | ||
39 | #define MSG_COUNT 4 | 39 | #define MSG_COUNT 4 |
40 | static DEFINE_PER_CPU(unsigned int, ps3_ipi_virqs[MSG_COUNT]); | 40 | static DEFINE_PER_CPU(unsigned int [MSG_COUNT], ps3_ipi_virqs); |
41 | 41 | ||
42 | static void do_message_pass(int target, int msg) | 42 | static void do_message_pass(int target, int msg) |
43 | { | 43 | { |
diff --git a/arch/s390/include/asm/percpu.h b/arch/s390/include/asm/percpu.h index 408d60b4f75b..f7ad8719d02d 100644 --- a/arch/s390/include/asm/percpu.h +++ b/arch/s390/include/asm/percpu.h | |||
@@ -1,37 +1,21 @@ | |||
1 | #ifndef __ARCH_S390_PERCPU__ | 1 | #ifndef __ARCH_S390_PERCPU__ |
2 | #define __ARCH_S390_PERCPU__ | 2 | #define __ARCH_S390_PERCPU__ |
3 | 3 | ||
4 | #include <linux/compiler.h> | ||
5 | #include <asm/lowcore.h> | ||
6 | |||
7 | /* | 4 | /* |
8 | * s390 uses its own implementation for per cpu data, the offset of | 5 | * s390 uses its own implementation for per cpu data, the offset of |
9 | * the cpu local data area is cached in the cpu's lowcore memory. | 6 | * the cpu local data area is cached in the cpu's lowcore memory. |
10 | * For 64 bit module code s390 forces the use of a GOT slot for the | ||
11 | * address of the per cpu variable. This is needed because the module | ||
12 | * may be more than 4G above the per cpu area. | ||
13 | */ | 7 | */ |
14 | #if defined(__s390x__) && defined(MODULE) | 8 | #define __my_cpu_offset S390_lowcore.percpu_offset |
15 | |||
16 | #define SHIFT_PERCPU_PTR(ptr,offset) (({ \ | ||
17 | extern int simple_identifier_##var(void); \ | ||
18 | unsigned long *__ptr; \ | ||
19 | asm ( "larl %0, %1@GOTENT" \ | ||
20 | : "=a" (__ptr) : "X" (ptr) ); \ | ||
21 | (typeof(ptr))((*__ptr) + (offset)); })) | ||
22 | |||
23 | #else | ||
24 | |||
25 | #define SHIFT_PERCPU_PTR(ptr, offset) (({ \ | ||
26 | extern int simple_identifier_##var(void); \ | ||
27 | unsigned long __ptr; \ | ||
28 | asm ( "" : "=a" (__ptr) : "0" (ptr) ); \ | ||
29 | (typeof(ptr)) (__ptr + (offset)); })) | ||
30 | 9 | ||
10 | /* | ||
11 | * For 64 bit module code, the module may be more than 4G above the | ||
12 | * per cpu area, use weak definitions to force the compiler to | ||
13 | * generate external references. | ||
14 | */ | ||
15 | #if defined(CONFIG_SMP) && defined(__s390x__) && defined(MODULE) | ||
16 | #define ARCH_NEEDS_WEAK_PER_CPU | ||
31 | #endif | 17 | #endif |
32 | 18 | ||
33 | #define __my_cpu_offset S390_lowcore.percpu_offset | ||
34 | |||
35 | #include <asm-generic/percpu.h> | 19 | #include <asm-generic/percpu.h> |
36 | 20 | ||
37 | #endif /* __ARCH_S390_PERCPU__ */ | 21 | #endif /* __ARCH_S390_PERCPU__ */ |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index a53db23ee092..98867dfea469 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -161,6 +161,7 @@ SECTIONS | |||
161 | /DISCARD/ : { | 161 | /DISCARD/ : { |
162 | EXIT_DATA | 162 | EXIT_DATA |
163 | *(.exitcall.exit) | 163 | *(.exitcall.exit) |
164 | *(.discard) | ||
164 | } | 165 | } |
165 | 166 | ||
166 | /* Debugging sections. */ | 167 | /* Debugging sections. */ |
diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S index f53c76acaede..766976d27b21 100644 --- a/arch/sh/kernel/vmlinux.lds.S +++ b/arch/sh/kernel/vmlinux.lds.S | |||
@@ -171,6 +171,7 @@ SECTIONS | |||
171 | */ | 171 | */ |
172 | /DISCARD/ : { | 172 | /DISCARD/ : { |
173 | *(.exitcall.exit) | 173 | *(.exitcall.exit) |
174 | *(.discard) | ||
174 | } | 175 | } |
175 | 176 | ||
176 | STABS_DEBUG | 177 | STABS_DEBUG |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 3f8b6a92eabd..4f6ed0f113f0 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -95,9 +95,6 @@ config AUDIT_ARCH | |||
95 | config HAVE_SETUP_PER_CPU_AREA | 95 | config HAVE_SETUP_PER_CPU_AREA |
96 | def_bool y if SPARC64 | 96 | def_bool y if SPARC64 |
97 | 97 | ||
98 | config HAVE_DYNAMIC_PER_CPU_AREA | ||
99 | def_bool y if SPARC64 | ||
100 | |||
101 | config GENERIC_HARDIRQS_NO__DO_IRQ | 98 | config GENERIC_HARDIRQS_NO__DO_IRQ |
102 | bool | 99 | bool |
103 | def_bool y if SPARC64 | 100 | def_bool y if SPARC64 |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index fcbbd000ec08..d63cf914667d 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
@@ -175,6 +175,7 @@ SECTIONS | |||
175 | EXIT_TEXT | 175 | EXIT_TEXT |
176 | EXIT_DATA | 176 | EXIT_DATA |
177 | *(.exitcall.exit) | 177 | *(.exitcall.exit) |
178 | *(.discard) | ||
178 | } | 179 | } |
179 | 180 | ||
180 | STABS_DEBUG | 181 | STABS_DEBUG |
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index 9975e1ab44fb..2916d6eadffd 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S | |||
@@ -156,4 +156,6 @@ SECTIONS | |||
156 | STABS_DEBUG | 156 | STABS_DEBUG |
157 | 157 | ||
158 | DWARF_DEBUG | 158 | DWARF_DEBUG |
159 | |||
160 | /DISCARD/ : { *(.discard) } | ||
159 | } | 161 | } |
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 11b835248b86..1f8a622cabe1 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S | |||
@@ -100,4 +100,6 @@ SECTIONS | |||
100 | STABS_DEBUG | 100 | STABS_DEBUG |
101 | 101 | ||
102 | DWARF_DEBUG | 102 | DWARF_DEBUG |
103 | |||
104 | /DISCARD/ : { *(.discard) } | ||
103 | } | 105 | } |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index c07f72205909..646fcabb0ad7 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -149,9 +149,6 @@ config ARCH_HAS_CACHE_LINE_SIZE | |||
149 | config HAVE_SETUP_PER_CPU_AREA | 149 | config HAVE_SETUP_PER_CPU_AREA |
150 | def_bool y | 150 | def_bool y |
151 | 151 | ||
152 | config HAVE_DYNAMIC_PER_CPU_AREA | ||
153 | def_bool y | ||
154 | |||
155 | config HAVE_CPUMASK_OF_CPU_MAP | 152 | config HAVE_CPUMASK_OF_CPU_MAP |
156 | def_bool X86_64_SMP | 153 | def_bool X86_64_SMP |
157 | 154 | ||
diff --git a/arch/x86/kernel/cpu/cpu_debug.c b/arch/x86/kernel/cpu/cpu_debug.c index 6b2a52dd0403..dca325c03999 100644 --- a/arch/x86/kernel/cpu/cpu_debug.c +++ b/arch/x86/kernel/cpu/cpu_debug.c | |||
@@ -30,8 +30,8 @@ | |||
30 | #include <asm/apic.h> | 30 | #include <asm/apic.h> |
31 | #include <asm/desc.h> | 31 | #include <asm/desc.h> |
32 | 32 | ||
33 | static DEFINE_PER_CPU(struct cpu_cpuX_base, cpu_arr[CPU_REG_ALL_BIT]); | 33 | static DEFINE_PER_CPU(struct cpu_cpuX_base [CPU_REG_ALL_BIT], cpu_arr); |
34 | static DEFINE_PER_CPU(struct cpu_private *, priv_arr[MAX_CPU_FILES]); | 34 | static DEFINE_PER_CPU(struct cpu_private * [MAX_CPU_FILES], priv_arr); |
35 | static DEFINE_PER_CPU(int, cpu_priv_count); | 35 | static DEFINE_PER_CPU(int, cpu_priv_count); |
36 | 36 | ||
37 | static DEFINE_MUTEX(cpu_debug_lock); | 37 | static DEFINE_MUTEX(cpu_debug_lock); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index af425b83202b..20d498351105 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -1091,7 +1091,7 @@ void mce_log_therm_throt_event(__u64 status) | |||
1091 | */ | 1091 | */ |
1092 | static int check_interval = 5 * 60; /* 5 minutes */ | 1092 | static int check_interval = 5 * 60; /* 5 minutes */ |
1093 | 1093 | ||
1094 | static DEFINE_PER_CPU(int, next_interval); /* in jiffies */ | 1094 | static DEFINE_PER_CPU(int, mce_next_interval); /* in jiffies */ |
1095 | static DEFINE_PER_CPU(struct timer_list, mce_timer); | 1095 | static DEFINE_PER_CPU(struct timer_list, mce_timer); |
1096 | 1096 | ||
1097 | static void mcheck_timer(unsigned long data) | 1097 | static void mcheck_timer(unsigned long data) |
@@ -1110,7 +1110,7 @@ static void mcheck_timer(unsigned long data) | |||
1110 | * Alert userspace if needed. If we logged an MCE, reduce the | 1110 | * Alert userspace if needed. If we logged an MCE, reduce the |
1111 | * polling interval, otherwise increase the polling interval. | 1111 | * polling interval, otherwise increase the polling interval. |
1112 | */ | 1112 | */ |
1113 | n = &__get_cpu_var(next_interval); | 1113 | n = &__get_cpu_var(mce_next_interval); |
1114 | if (mce_notify_irq()) | 1114 | if (mce_notify_irq()) |
1115 | *n = max(*n/2, HZ/100); | 1115 | *n = max(*n/2, HZ/100); |
1116 | else | 1116 | else |
@@ -1311,7 +1311,7 @@ static void mce_cpu_features(struct cpuinfo_x86 *c) | |||
1311 | static void mce_init_timer(void) | 1311 | static void mce_init_timer(void) |
1312 | { | 1312 | { |
1313 | struct timer_list *t = &__get_cpu_var(mce_timer); | 1313 | struct timer_list *t = &__get_cpu_var(mce_timer); |
1314 | int *n = &__get_cpu_var(next_interval); | 1314 | int *n = &__get_cpu_var(mce_next_interval); |
1315 | 1315 | ||
1316 | if (mce_ignore_ce) | 1316 | if (mce_ignore_ce) |
1317 | return; | 1317 | return; |
@@ -1914,7 +1914,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
1914 | case CPU_DOWN_FAILED: | 1914 | case CPU_DOWN_FAILED: |
1915 | case CPU_DOWN_FAILED_FROZEN: | 1915 | case CPU_DOWN_FAILED_FROZEN: |
1916 | t->expires = round_jiffies(jiffies + | 1916 | t->expires = round_jiffies(jiffies + |
1917 | __get_cpu_var(next_interval)); | 1917 | __get_cpu_var(mce_next_interval)); |
1918 | add_timer_on(t, cpu); | 1918 | add_timer_on(t, cpu); |
1919 | smp_call_function_single(cpu, mce_reenable_cpu, &action, 1); | 1919 | smp_call_function_single(cpu, mce_reenable_cpu, &action, 1); |
1920 | break; | 1920 | break; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index ddae21620bda..bd2a2fa84628 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
@@ -69,7 +69,7 @@ struct threshold_bank { | |||
69 | struct threshold_block *blocks; | 69 | struct threshold_block *blocks; |
70 | cpumask_var_t cpus; | 70 | cpumask_var_t cpus; |
71 | }; | 71 | }; |
72 | static DEFINE_PER_CPU(struct threshold_bank *, threshold_banks[NR_BANKS]); | 72 | static DEFINE_PER_CPU(struct threshold_bank * [NR_BANKS], threshold_banks); |
73 | 73 | ||
74 | #ifdef CONFIG_SMP | 74 | #ifdef CONFIG_SMP |
75 | static unsigned char shared_bank[NR_BANKS] = { | 75 | static unsigned char shared_bank[NR_BANKS] = { |
diff --git a/arch/x86/kernel/cpu/perf_counter.c b/arch/x86/kernel/cpu/perf_counter.c index d4cf4ce19aac..13bd6d6cf0bd 100644 --- a/arch/x86/kernel/cpu/perf_counter.c +++ b/arch/x86/kernel/cpu/perf_counter.c | |||
@@ -862,7 +862,7 @@ amd_pmu_disable_counter(struct hw_perf_counter *hwc, int idx) | |||
862 | x86_pmu_disable_counter(hwc, idx); | 862 | x86_pmu_disable_counter(hwc, idx); |
863 | } | 863 | } |
864 | 864 | ||
865 | static DEFINE_PER_CPU(u64, prev_left[X86_PMC_IDX_MAX]); | 865 | static DEFINE_PER_CPU(u64 [X86_PMC_IDX_MAX], pmc_prev_left); |
866 | 866 | ||
867 | /* | 867 | /* |
868 | * Set the next IRQ period, based on the hwc->period_left value. | 868 | * Set the next IRQ period, based on the hwc->period_left value. |
@@ -901,7 +901,7 @@ x86_perf_counter_set_period(struct perf_counter *counter, | |||
901 | if (left > x86_pmu.max_period) | 901 | if (left > x86_pmu.max_period) |
902 | left = x86_pmu.max_period; | 902 | left = x86_pmu.max_period; |
903 | 903 | ||
904 | per_cpu(prev_left[idx], smp_processor_id()) = left; | 904 | per_cpu(pmc_prev_left[idx], smp_processor_id()) = left; |
905 | 905 | ||
906 | /* | 906 | /* |
907 | * The hw counter starts counting from this counter offset, | 907 | * The hw counter starts counting from this counter offset, |
@@ -1086,7 +1086,7 @@ void perf_counter_print_debug(void) | |||
1086 | rdmsrl(x86_pmu.eventsel + idx, pmc_ctrl); | 1086 | rdmsrl(x86_pmu.eventsel + idx, pmc_ctrl); |
1087 | rdmsrl(x86_pmu.perfctr + idx, pmc_count); | 1087 | rdmsrl(x86_pmu.perfctr + idx, pmc_count); |
1088 | 1088 | ||
1089 | prev_left = per_cpu(prev_left[idx], cpu); | 1089 | prev_left = per_cpu(pmc_prev_left[idx], cpu); |
1090 | 1090 | ||
1091 | pr_info("CPU#%d: gen-PMC%d ctrl: %016llx\n", | 1091 | pr_info("CPU#%d: gen-PMC%d ctrl: %016llx\n", |
1092 | cpu, idx, pmc_ctrl); | 1092 | cpu, idx, pmc_ctrl); |
@@ -1559,8 +1559,8 @@ void callchain_store(struct perf_callchain_entry *entry, u64 ip) | |||
1559 | entry->ip[entry->nr++] = ip; | 1559 | entry->ip[entry->nr++] = ip; |
1560 | } | 1560 | } |
1561 | 1561 | ||
1562 | static DEFINE_PER_CPU(struct perf_callchain_entry, irq_entry); | 1562 | static DEFINE_PER_CPU(struct perf_callchain_entry, pmc_irq_entry); |
1563 | static DEFINE_PER_CPU(struct perf_callchain_entry, nmi_entry); | 1563 | static DEFINE_PER_CPU(struct perf_callchain_entry, pmc_nmi_entry); |
1564 | 1564 | ||
1565 | 1565 | ||
1566 | static void | 1566 | static void |
@@ -1707,9 +1707,9 @@ struct perf_callchain_entry *perf_callchain(struct pt_regs *regs) | |||
1707 | struct perf_callchain_entry *entry; | 1707 | struct perf_callchain_entry *entry; |
1708 | 1708 | ||
1709 | if (in_nmi()) | 1709 | if (in_nmi()) |
1710 | entry = &__get_cpu_var(nmi_entry); | 1710 | entry = &__get_cpu_var(pmc_nmi_entry); |
1711 | else | 1711 | else |
1712 | entry = &__get_cpu_var(irq_entry); | 1712 | entry = &__get_cpu_var(pmc_irq_entry); |
1713 | 1713 | ||
1714 | entry->nr = 0; | 1714 | entry->nr = 0; |
1715 | 1715 | ||
diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S index 41c159cd872f..b1e24638acd7 100644 --- a/arch/xtensa/kernel/vmlinux.lds.S +++ b/arch/xtensa/kernel/vmlinux.lds.S | |||
@@ -287,6 +287,7 @@ SECTIONS | |||
287 | EXIT_TEXT | 287 | EXIT_TEXT |
288 | EXIT_DATA | 288 | EXIT_DATA |
289 | *(.exitcall.exit) | 289 | *(.exitcall.exit) |
290 | *(.discard) | ||
290 | } | 291 | } |
291 | 292 | ||
292 | .xt.lit : { *(.xt.lit) } | 293 | .xt.lit : { *(.xt.lit) } |