Hi David. I was looking into the few remaining section mismatch warnings on sparc64 (with my previous posted patchset applied). This is more an RFC than a real patch submission. Can you try to look through my mumblings and see if anything makes sense. The ones I have is: WARNING: vmlinux.o(.text+0x3d76c): Section mismatch in reference from the variable after_lock_tlb to the function .cpuinit.text:sun4v_register_mondo_queues() The function after_lock_tlb() references the function __cpuinit sun4v_register_mondo_queues(). This is often because after_lock_tlb lacks a __cpuinit annotation or the annotation of sun4v_register_mondo_queues is wrong. WARNING: vmlinux.o(.text+0x3d88c): Section mismatch in reference from the variable after_lock_tlb to the function .devinit.text:smp_callin() The function after_lock_tlb() references the function __devinit smp_callin(). This is often because after_lock_tlb lacks a __devinit annotation or the annotation of smp_callin is wrong. This is due to the calls to smp_callin and sun4v_register_mondo_queues in trampoline.S after_lock_tlb is blamed because this is the first symbol modpost could find. I assume this code is executed only once for non HOTPLUG_CPU cases and for HOTPLUG_CPU cases when a CPU is brought online. So it should be __cpuinit code. Like this: diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S index 04e81dd..7cd4636 100644 --- a/arch/sparc64/kernel/trampoline.S +++ b/arch/sparc64/kernel/trampoline.S @@ -36,7 +36,7 @@ dtlb_load: tramp_stack: .skip TRAMP_STACK_SIZE - .text + __CPUINIT .align 8 .globl sparc64_cpu_startup, sparc64_cpu_startup_end sparc64_cpu_startup: That would match the declaration of sun4v_register_mondo_queues but not smp_callin. Looking at the code (not claiming I understand it I guess it should be __cpuinit as this is again only executed after init in HOTPLUG_CPU cases. So something like this: diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index a8052b7..cc45473 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c @@ -86,7 +86,7 @@ extern void setup_sparc64_timer(void); static volatile unsigned long callin_flag = 0; -void __devinit smp_callin(void) +void __cpuinit smp_callin(void) { int cpuid = hard_smp_processor_id(); WARNING: vmlinux.o(.text+0x3d9ac): Section mismatch in reference from the variable hv_cpu_startup to the function .cpuinit.text:sun4v_register_mondo_queues() The function hv_cpu_startup() references the function __cpuinit sun4v_register_mondo_queues(). This is often because hv_cpu_startup lacks a __cpuinit annotation or the annotation of sun4v_register_mondo_queues is wrong. WARNING: vmlinux.o(.text+0x3d9c0): Section mismatch in reference from the variable hv_cpu_startup to the function .devinit.text:smp_callin() The function hv_cpu_startup() references the function __devinit smp_callin(). This is often because hv_cpu_startup lacks a __devinit annotation or the annotation of smp_callin is wrong. Same story as above - so something like this: diff --git a/arch/sparc64/kernel/hvtramp.S b/arch/sparc64/kernel/hvtramp.S index b692e04..014fb45 100644 --- a/arch/sparc64/kernel/hvtramp.S +++ b/arch/sparc64/kernel/hvtramp.S @@ -13,7 +13,7 @@ #include <asm/head.h> #include <asm/asi.h> - .text + __CPUINIT .align 8 .globl hv_cpu_startup, hv_cpu_startup_end WARNING: vmlinux.o(.text+0x47094): Section mismatch in reference from the function dr_cpu_data() to the function .devinit.text:mdesc_fill_in_cpu_data() The function dr_cpu_data() references the function __devinit mdesc_fill_in_cpu_data(). This is often because dr_cpu_data lacks a __devinit annotation or the annotation of mdesc_fill_in_cpu_data is wrong. I could not see how to fix this in a clean way. dr_cpu_data() references mdesc_fill_in_cpu_data() via dr_cpu_configure() and that looks bogus. Full diff of the included changes below. If you can use this in part or in toal they have my: Signed-off-by: Sam Ravnborg <sam@xxxxxxxxxxxx> Sam diff --git a/arch/sparc64/kernel/hvtramp.S b/arch/sparc64/kernel/hvtramp.S index b692e04..0236c43 100644 --- a/arch/sparc64/kernel/hvtramp.S +++ b/arch/sparc64/kernel/hvtramp.S @@ -3,6 +3,8 @@ * Copyright (C) 2007 David S. Miller <davem@xxxxxxxxxxxxx> */ +#include <linux/init.h> + #include <asm/thread_info.h> #include <asm/hypervisor.h> #include <asm/scratchpad.h> @@ -13,7 +15,7 @@ #include <asm/head.h> #include <asm/asi.h> - .text + __CPUINIT .align 8 .globl hv_cpu_startup, hv_cpu_startup_end diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index a8052b7..cc45473 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c @@ -86,7 +86,7 @@ extern void setup_sparc64_timer(void); static volatile unsigned long callin_flag = 0; -void __devinit smp_callin(void) +void __cpuinit smp_callin(void) { int cpuid = hard_smp_processor_id(); diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S index 04e81dd..4ae2e52 100644 --- a/arch/sparc64/kernel/trampoline.S +++ b/arch/sparc64/kernel/trampoline.S @@ -4,6 +4,8 @@ * Copyright (C) 1997 David S. Miller (davem@xxxxxxxxxxxxxxxx) */ +#include <linux/init.h> + #include <asm/head.h> #include <asm/asi.h> #include <asm/lsu.h> @@ -36,7 +38,7 @@ dtlb_load: tramp_stack: .skip TRAMP_STACK_SIZE - .text + __CPUINIT .align 8 .globl sparc64_cpu_startup, sparc64_cpu_startup_end sparc64_cpu_startup: - To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html