diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-27 16:04:48 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-28 13:06:21 -0400 |
commit | 90140c30a7b8c77e8872a389d48678d78e58789f (patch) | |
tree | ddb78c7811e89b750a7cbd364e1edcfca1981b26 | |
parent | e616c591405c168f6dc3dfd1221e105adfe49b8d (diff) |
ARM: Fix __cpuexit section mismatch warnings
Fix:
WARNING: vmlinux.o(.text+0x247c): Section mismatch in reference from the function cpu_idle() to the function .cpuexit.text:cpu_die()
The function cpu_idle() references a function in an exit section.
Often the function cpu_die() has valid usage outside the exit section
and the fix is to remove the __cpuexit annotation of cpu_die.
WARNING: vmlinux.o(.cpuexit.text+0x3c): Section mismatch in reference from the function cpu_die() to the function .cpuinit.text:secondary_start_kernel()
The function __cpuexit cpu_die() references
a function __cpuinit secondary_start_kernel().
This is often seen when error handling in the exit function
uses functionality in the init path.
The fix is often to remove the __cpuinit annotation of
secondary_start_kernel() so it may be used outside an init section.
Sam says:
> The annotation of cpu_die() is wrong.
> To be annotated __cpuexit the function shall:
> - be used in exit context and only in exit context with HOTPLUG_CPU=n
> - be used outside exit context with HOTPLUG_CPU=y
So, this also means __cpu_disable(), __cpu_die() and twd_timer_stop() are
also wrong. However, removing __cpuexit from cpu_die() creates:
WARNING: vmlinux.o(.text+0x6834): Section mismatch in reference from the function cpu_die() to the function .cpuinit.text:secondary_start_kernel()
The function cpu_die() references
the function __cpuinit secondary_start_kernel().
This is often because cpu_die lacks a __cpuinit
annotation or the annotation of secondary_start_kernel is wrong.
so fix this using __ref.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
-rw-r--r-- | arch/arm/kernel/smp.c | 6 | ||||
-rw-r--r-- | arch/arm/kernel/smp_twd.c | 4 |
2 files changed, 6 insertions, 4 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 9d015ee5747a..57162af53dc9 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -154,7 +154,7 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
154 | /* | 154 | /* |
155 | * __cpu_disable runs on the processor to be shutdown. | 155 | * __cpu_disable runs on the processor to be shutdown. |
156 | */ | 156 | */ |
157 | int __cpuexit __cpu_disable(void) | 157 | int __cpu_disable(void) |
158 | { | 158 | { |
159 | unsigned int cpu = smp_processor_id(); | 159 | unsigned int cpu = smp_processor_id(); |
160 | struct task_struct *p; | 160 | struct task_struct *p; |
@@ -201,7 +201,7 @@ int __cpuexit __cpu_disable(void) | |||
201 | * called on the thread which is asking for a CPU to be shutdown - | 201 | * called on the thread which is asking for a CPU to be shutdown - |
202 | * waits until shutdown has completed, or it is timed out. | 202 | * waits until shutdown has completed, or it is timed out. |
203 | */ | 203 | */ |
204 | void __cpuexit __cpu_die(unsigned int cpu) | 204 | void __cpu_die(unsigned int cpu) |
205 | { | 205 | { |
206 | if (!platform_cpu_kill(cpu)) | 206 | if (!platform_cpu_kill(cpu)) |
207 | printk("CPU%u: unable to kill\n", cpu); | 207 | printk("CPU%u: unable to kill\n", cpu); |
@@ -215,7 +215,7 @@ void __cpuexit __cpu_die(unsigned int cpu) | |||
215 | * of the other hotplug-cpu capable cores, so presumably coming | 215 | * of the other hotplug-cpu capable cores, so presumably coming |
216 | * out of idle fixes this. | 216 | * out of idle fixes this. |
217 | */ | 217 | */ |
218 | void __cpuexit cpu_die(void) | 218 | void __ref cpu_die(void) |
219 | { | 219 | { |
220 | unsigned int cpu = smp_processor_id(); | 220 | unsigned int cpu = smp_processor_id(); |
221 | 221 | ||
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index d8c88c633c6f..a73a34dccf2a 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
@@ -166,10 +166,12 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) | |||
166 | clockevents_register_device(clk); | 166 | clockevents_register_device(clk); |
167 | } | 167 | } |
168 | 168 | ||
169 | #ifdef CONFIG_HOTPLUG_CPU | ||
169 | /* | 170 | /* |
170 | * take a local timer down | 171 | * take a local timer down |
171 | */ | 172 | */ |
172 | void __cpuexit twd_timer_stop(void) | 173 | void twd_timer_stop(void) |
173 | { | 174 | { |
174 | __raw_writel(0, twd_base + TWD_TIMER_CONTROL); | 175 | __raw_writel(0, twd_base + TWD_TIMER_CONTROL); |
175 | } | 176 | } |
177 | #endif | ||