Re: [PATCH] x86: silence section mismatch warning - uv_cpu_init

Previous thread: [PATCH] x86, mmiotrace: silence section mismatch warning - leave_uniprocessor by Marcin Slusarz on Wednesday, August 20, 2008 - 12:07 pm. (2 messages)

Next thread: [PATCH] Use EXPORT_SYMBOL for pv_lock_ops by drago01 on Wednesday, August 20, 2008 - 12:25 pm. (2 messages)
From: Marcin Slusarz
Date: Wednesday, August 20, 2008 - 12:07 pm

WARNING: vmlinux.o(.cpuinit.text+0x3cc4): Section mismatch in reference from the function uv_cpu_init() to the function .init.text:uv_system_init()
The function __cpuinit uv_cpu_init() references
a function __init uv_system_init().
If uv_system_init is only used by uv_cpu_init then
annotate uv_system_init with a matching annotation.

uv_system_init was ment to be called only once, so make explicit
by creating properly-named function and annotate it as __ref.

Old code relied on uv_node_to_blade being initialized to 0,
but it'a not initialized from anywhere and it's not static either.

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jack Steiner <steiner@sgi.com>
---
 arch/x86/kernel/genx2apic_uv_x.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c
index 2d7e307..ecbfefa 100644
--- a/arch/x86/kernel/genx2apic_uv_x.c
+++ b/arch/x86/kernel/genx2apic_uv_x.c
@@ -385,14 +385,24 @@ static __init void uv_system_init(void)
 	map_mmioh_high(max_pnode);
 }
 
+/* Wrapper for uv_system_init which calls it only once. */
+static void __ref uv_system_init_once(void)
+{
+	static bool uv_system_inited = false;
+
+	if (!uv_system_inited) {
+		uv_system_init();
+		uv_system_inited = true;
+	}
+}
+
 /*
  * Called on each cpu to initialize the per_cpu UV data area.
  * 	ZZZ hotplug not supported yet
  */
 void __cpuinit uv_cpu_init(void)
 {
-	if (!uv_node_to_blade)
-		uv_system_init();
+	uv_system_init_once();
 
 	uv_blade_info[uv_numa_blade_id()].nr_online_cpus++;
 
-- 
1.5.4.5

--

From: Ingo Molnar
Date: Thursday, August 21, 2008 - 3:34 am

this needs a proper fix as the patch is too ugly. If something should be 
called only once then it has to go into a codepath that will only 
initialize it once.

	Ingo
--

From: Marcin Slusarz
Date: Thursday, August 21, 2008 - 11:49 am

Agreed. However it was the easiest solution.
Below is a new version of this fix. It was compile and boot tested
only on simple x86-64 box, so it needs testing on affected hardware
(where is_uv_system() == true).

---
From: Marcin Slusarz <marcin.slusarz@gmail.com>
Subject: [PATCH v2] x86: fix section mismatch warning - uv_cpu_init

WARNING: vmlinux.o(.cpuinit.text+0x3cc4): Section mismatch in reference from the function uv_cpu_init() to the function .init.text:uv_system_init()
The function __cpuinit uv_cpu_init() references
a function __init uv_system_init().
If uv_system_init is only used by uv_cpu_init then
annotate uv_system_init with a matching annotation.

uv_system_init was ment to be called only once, so do it from codepath
(native_smp_prepare_cpus) which is called once, right before activation
of other cpus (smp_init).

Note: old code relied on uv_node_to_blade being initialized to 0,
but it'a not initialized from anywhere.

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jack Steiner <steiner@sgi.com>
---
 arch/x86/kernel/genx2apic_uv_x.c |    8 +++++---
 arch/x86/kernel/smpboot.c        |    3 +++
 include/asm-x86/genapic_32.h     |    1 +
 include/asm-x86/genapic_64.h     |    1 +
 4 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c
index 2d7e307..bfa837c 100644
--- a/arch/x86/kernel/genx2apic_uv_x.c
+++ b/arch/x86/kernel/genx2apic_uv_x.c
@@ -293,7 +293,9 @@ static __init void uv_rtc_init(void)
 		sn_rtc_cycles_per_second = ticks_per_sec;
 }
 
-static __init void uv_system_init(void)
+static bool uv_system_inited;
+
+void __init uv_system_init(void)
 {
 	union uvh_si_addr_map_config_u m_n_config;
 	union uvh_node_id_u node_id;
@@ -383,6 +385,7 @@ static __init void uv_system_init(void)
 	map_mmr_high(max_pnode);
 	map_config_high(max_pnode);
 	map_mmioh_high(max_pnode);
+	uv_system_inited = true;
 }
 
 /*
@@ -391,8 ...
From: Ingo Molnar
Date: Thursday, August 21, 2008 - 11:19 pm

thanks - applied it to tip/x86/urgent. Jack, any objections?

	Ingo
--

From: Jack Steiner
Date: Friday, August 22, 2008 - 4:31 am

Looks good. Thanks.

Acked-by: Jack Steiner <steiner@sgi.com>

--- jack
--

Previous thread: [PATCH] x86, mmiotrace: silence section mismatch warning - leave_uniprocessor by Marcin Slusarz on Wednesday, August 20, 2008 - 12:07 pm. (2 messages)

Next thread: [PATCH] Use EXPORT_SYMBOL for pv_lock_ops by drago01 on Wednesday, August 20, 2008 - 12:25 pm. (2 messages)