Subject: Avoid section mismatch involving arch_register_cpu

Avoid section mismatch involving arch_register_cpu.

Marking arch_register_cpu as __init and removing the export
for non-hotplug-cpu configurations makes the following warning
go away:

Section mismatch in reference from the function
arch_register_cpu() to the function .devinit.text:register_cpu()
The function arch_register_cpu() references
the function __devinit register_cpu().
This is often because arch_register_cpu lacks a __devinit
annotation or the annotation of register_cpu is wrong.

The only external user of arch_register_cpu in the tree is
in drivers/acpi/processor_core.c where it is guarded by
ACPI_HOTPLUG_CPU (which depends on HOTPLUG_CPU).

Signed-off-by: Alexander van Heukelum <[email protected]>
CC: Sam Ravnborg <[email protected]>


diff --git a/arch/x86/kernel/topology.c b/arch/x86/kernel/topology.c
index 78cbb65..e6757aa 100644
--- a/arch/x86/kernel/topology.c
+++ b/arch/x86/kernel/topology.c
@@ -57,11 +57,10 @@ void arch_unregister_cpu(int num)
}
EXPORT_SYMBOL(arch_unregister_cpu);
#else
-int arch_register_cpu(int num)
+static int __init arch_register_cpu(int num)
{
return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
}
-EXPORT_SYMBOL(arch_register_cpu);
#endif /*CONFIG_HOTPLUG_CPU*/

static int __init topology_init(void)
diff --git a/include/asm-x86/cpu.h b/include/asm-x86/cpu.h
index 85ece5f..73f2ea8 100644
--- a/include/asm-x86/cpu.h
+++ b/include/asm-x86/cpu.h
@@ -10,8 +10,9 @@
struct x86_cpu {
struct cpu cpu;
};
-extern int arch_register_cpu(int num);
+
#ifdef CONFIG_HOTPLUG_CPU
+extern int arch_register_cpu(int num);
extern void arch_unregister_cpu(int);
#endif


2008-02-01 15:03:18

by Sam Ravnborg

[permalink] [raw]
Subject: Re: Avoid section mismatch involving arch_register_cpu

Hi Alexander.

See below for my take on the same warning.
It is already in x86.git pending merge.

Comments welcome.

Sam

>From b7b4f3e109c742d32d255e04b7c2f90d08599ea8 Mon Sep 17 00:00:00 2001
From: Sam Ravnborg <[email protected]>
Date: Sat, 26 Jan 2008 21:25:08 +0100
Subject: [PATCH] x86: fix section mismatch warning in topology.c

Fix following warning:
WARNING: arch/x86/kernel/built-in.o(__ksymtab+0x2b0): Section mismatch: reference to .cpuinit.text:arch_register_cpu in '__ksymtab_arch_register_cpu'

Annotating exported symbols are wrong.
Previously the warning were hidden by avoiding the export
in the non HOTPLUG_CPU case but the improved checks in
modpost caught it anyway.
Fix it by removing the __cpuinit annotation and rearrange the
code a bit to save one ifdef/endif pair.

Signed-off-by: Sam Ravnborg <[email protected]>
---
arch/x86/kernel/topology.c | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/topology.c b/arch/x86/kernel/topology.c
index a0d1719..78cbb65 100644
--- a/arch/x86/kernel/topology.c
+++ b/arch/x86/kernel/topology.c
@@ -33,7 +33,8 @@

static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);

-int __cpuinit arch_register_cpu(int num)
+#ifdef CONFIG_HOTPLUG_CPU
+int arch_register_cpu(int num)
{
/*
* CPU0 cannot be offlined due to several
@@ -44,21 +45,23 @@ int __cpuinit arch_register_cpu(int num)
* Also certain PCI quirks require not to enable hotplug control
* for all CPU's.
*/
-#ifdef CONFIG_HOTPLUG_CPU
if (num)
per_cpu(cpu_devices, num).cpu.hotpluggable = 1;
-#endif
-
return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
}
+EXPORT_SYMBOL(arch_register_cpu);

-#ifdef CONFIG_HOTPLUG_CPU
void arch_unregister_cpu(int num)
{
return unregister_cpu(&per_cpu(cpu_devices, num).cpu);
}
-EXPORT_SYMBOL(arch_register_cpu);
EXPORT_SYMBOL(arch_unregister_cpu);
+#else
+int arch_register_cpu(int num)
+{
+ return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
+}
+EXPORT_SYMBOL(arch_register_cpu);
#endif /*CONFIG_HOTPLUG_CPU*/

static int __init topology_init(void)
--
1.5.4.rc3.14.g44397

2008-02-01 15:42:20

by Alexander van Heukelum

[permalink] [raw]
Subject: Re: Avoid section mismatch involving arch_register_cpu


On Fri, 1 Feb 2008 16:03:12 +0100, "Sam Ravnborg" <[email protected]>
said:
> Hi Alexander.
>
> See below for my take on the same warning.
> It is already in x86.git pending merge.

Hi!

The patch you forwarded is in Linus' tree already. It only
changed one warning into another one, however. My guess is
that you did not see the new warning due to inlining, but I
compiled with CONFIG_CC_OPTIMIZE_FOR_SIZE=y.

Greetings,
Alexander
--
Alexander van Heukelum
[email protected]

--
http://www.fastmail.fm - And now for something completely different?

2008-02-01 16:37:29

by Sam Ravnborg

[permalink] [raw]
Subject: Re: Avoid section mismatch involving arch_register_cpu

On Fri, Feb 01, 2008 at 04:21:12PM +0100, Alexander van Heukelum wrote:
>
> On Fri, 1 Feb 2008 16:03:12 +0100, "Sam Ravnborg" <[email protected]>
> said:
> > Hi Alexander.
> >
> > See below for my take on the same warning.
> > It is already in x86.git pending merge.
>
> Hi!
>
> The patch you forwarded is in Linus' tree already. It only
> changed one warning into another one, however. My guess is
> that you did not see the new warning due to inlining, but I
> compiled with CONFIG_CC_OPTIMIZE_FOR_SIZE=y.

You are right - now I actually looked at your patch.

Sam

2008-02-01 16:44:29

by Sam Ravnborg

[permalink] [raw]
Subject: Re: Avoid section mismatch involving arch_register_cpu

On Fri, Feb 01, 2008 at 03:56:50PM +0100, Alexander van Heukelum wrote:
> Avoid section mismatch involving arch_register_cpu.
>
> Marking arch_register_cpu as __init and removing the export
> for non-hotplug-cpu configurations makes the following warning
> go away:
>
> Section mismatch in reference from the function
> arch_register_cpu() to the function .devinit.text:register_cpu()
> The function arch_register_cpu() references
> the function __devinit register_cpu().
> This is often because arch_register_cpu lacks a __devinit
> annotation or the annotation of register_cpu is wrong.
>
> The only external user of arch_register_cpu in the tree is
> in drivers/acpi/processor_core.c where it is guarded by
> ACPI_HOTPLUG_CPU (which depends on HOTPLUG_CPU).
>
> Signed-off-by: Alexander van Heukelum <[email protected]>
> CC: Sam Ravnborg <[email protected]>
Acked-by: Sam Ravnborg <[email protected]>

Added Ingo so he can pick it up.

Sam

>
>
> diff --git a/arch/x86/kernel/topology.c b/arch/x86/kernel/topology.c
> index 78cbb65..e6757aa 100644
> --- a/arch/x86/kernel/topology.c
> +++ b/arch/x86/kernel/topology.c
> @@ -57,11 +57,10 @@ void arch_unregister_cpu(int num)
> }
> EXPORT_SYMBOL(arch_unregister_cpu);
> #else
> -int arch_register_cpu(int num)
> +static int __init arch_register_cpu(int num)
> {
> return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
> }
> -EXPORT_SYMBOL(arch_register_cpu);
> #endif /*CONFIG_HOTPLUG_CPU*/
>
> static int __init topology_init(void)
> diff --git a/include/asm-x86/cpu.h b/include/asm-x86/cpu.h
> index 85ece5f..73f2ea8 100644
> --- a/include/asm-x86/cpu.h
> +++ b/include/asm-x86/cpu.h
> @@ -10,8 +10,9 @@
> struct x86_cpu {
> struct cpu cpu;
> };
> -extern int arch_register_cpu(int num);
> +
> #ifdef CONFIG_HOTPLUG_CPU
> +extern int arch_register_cpu(int num);
> extern void arch_unregister_cpu(int);
> #endif
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

2008-02-01 16:51:46

by Ingo Molnar

[permalink] [raw]
Subject: Re: Avoid section mismatch involving arch_register_cpu


* Sam Ravnborg <[email protected]> wrote:

> > The only external user of arch_register_cpu in the tree is in
> > drivers/acpi/processor_core.c where it is guarded by
> > ACPI_HOTPLUG_CPU (which depends on HOTPLUG_CPU).
> >
> > Signed-off-by: Alexander van Heukelum <[email protected]>
> > CC: Sam Ravnborg <[email protected]>
> Acked-by: Sam Ravnborg <[email protected]>
>
> Added Ingo so he can pick it up.

yep, already did so.

Ingo