aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2009-09-27 16:04:48 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-09-28 13:06:21 -0400
commit90140c30a7b8c77e8872a389d48678d78e58789f (patch)
treeddb78c7811e89b750a7cbd364e1edcfca1981b26 /arch/arm/kernel
parente616c591405c168f6dc3dfd1221e105adfe49b8d (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')
-rw-r--r--arch/arm/kernel/smp.c6
-rw-r--r--arch/arm/kernel/smp_twd.c4
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 */
157int __cpuexit __cpu_disable(void) 157int __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 */
204void __cpuexit __cpu_die(unsigned int cpu) 204void __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 */
218void __cpuexit cpu_die(void) 218void __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 */
172void __cpuexit twd_timer_stop(void) 173void 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