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