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 /arch/arm/kernel/smp.c | |
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>
Diffstat (limited to 'arch/arm/kernel/smp.c')
-rw-r--r-- | arch/arm/kernel/smp.c | 6 |
1 files changed, 3 insertions, 3 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 | ||