lkml.org 
[lkml]   [2009]   [Sep]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: Solving section mismatches
    On Sun, Sep 27, 2009 at 09:47:47PM +0200, Sam Ravnborg wrote:
    > Please try this:
    > diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
    > index e0d3277..835188b 100644
    > --- a/arch/arm/kernel/smp.c
    > +++ b/arch/arm/kernel/smp.c
    > @@ -214,7 +214,7 @@ void __cpuexit __cpu_die(unsigned int cpu)
    > * of the other hotplug-cpu capable cores, so presumably coming
    > * out of idle fixes this.
    > */
    > -void __cpuexit cpu_die(void)
    > +void __ref cpu_die(void)
    > {
    > unsigned int cpu = smp_processor_id();

    That works - so can I get your ack for this entire patch please:

    From: Russell King <rmk+kernel@arm.linux.org.uk>
    Subject: [PATCH] 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>
    ---
    arch/arm/kernel/smp.c | 6 +++---
    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 9d015ee..57162af 100644
    --- a/arch/arm/kernel/smp.c
    +++ b/arch/arm/kernel/smp.c
    @@ -154,7 +154,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
    /*
    * __cpu_disable runs on the processor to be shutdown.
    */
    -int __cpuexit __cpu_disable(void)
    +int __cpu_disable(void)
    {
    unsigned int cpu = smp_processor_id();
    struct task_struct *p;
    @@ -201,7 +201,7 @@ int __cpuexit __cpu_disable(void)
    * called on the thread which is asking for a CPU to be shutdown -
    * waits until shutdown has completed, or it is timed out.
    */
    -void __cpuexit __cpu_die(unsigned int cpu)
    +void __cpu_die(unsigned int cpu)
    {
    if (!platform_cpu_kill(cpu))
    printk("CPU%u: unable to kill\n", cpu);
    @@ -215,7 +215,7 @@ void __cpuexit __cpu_die(unsigned int cpu)
    * of the other hotplug-cpu capable cores, so presumably coming
    * out of idle fixes this.
    */
    -void __cpuexit cpu_die(void)
    +void __ref cpu_die(void)
    {
    unsigned int cpu = smp_processor_id();

    diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
    index d8c88c6..a73a34d 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)
    clockevents_register_device(clk);
    }

    +#ifdef CONFIG_HOTPLUG_CPU
    /*
    * take a local timer down
    */
    -void __cpuexit twd_timer_stop(void)
    +void twd_timer_stop(void)
    {
    __raw_writel(0, twd_base + TWD_TIMER_CONTROL);
    }
    +#endif

    \
     
     \ /
      Last update: 2009-09-27 22:17    [W:0.026 / U:0.744 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site