On Tue, Feb 19, 2008 at 09:30:42AM +0100, Geert Uytterhoeven wrote:
> On Mon, 18 Feb 2008, Sam Ravnborg wrote:
> > I have (triggered by Geert) spend some time reviewing this patch
> > and I see no better way to fix it.
> > 
> > So it gets my:
> > 
> > Reviewed-by: Sam Ravnborg <[EMAIL PROTECTED]>
> 
> Acked-by: Geert Uytterhoeven <[EMAIL PROTECTED]>

Thanks!

I more than less expected people to scream "ugly, ugly!". Maybe you
could consider the following patch, instead?

In non-HOTPLUG configurations, devinit and init sections in vmlinux
are lumped together during the final link. There is no good reason
to warn about section mismatches between them in this case, because
all code is discarded at the same time. This patch moves the lumping-
together to the compile stage, which makes the unnecessary warnings
go away. Same for MEMORY_HOTPLUG/meminit and HOTPLUG_CPU/cpuinit.

On the condition that someone with knowledge in this area confirms
that this approach is right and not for some reason undesirable:

Signed-off-by: Alexander van Heukelum <[EMAIL PROTECTED]>

 include/asm-generic/vmlinux.lds.h |   98 ++++++++----------------------------
 include/linux/init.h              |   27 ++++++++++
 2 files changed, 49 insertions(+), 76 deletions(-)

diff --git a/include/asm-generic/vmlinux.lds.h 
b/include/asm-generic/vmlinux.lds.h
index f054778..742152b 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -9,46 +9,17 @@
 /* Align . to a 8 byte boundary equals to maximum function alignment. */
 #define ALIGN_FUNCTION()  . = ALIGN(8)
 
-/* The actual configuration determine if the init/exit sections
- * are handled as text/data or they can be discarded (which
- * often happens at runtime)
- */
-#ifdef CONFIG_HOTPLUG
-#define DEV_KEEP(sec)    *(.dev##sec)
-#define DEV_DISCARD(sec)
-#else
-#define DEV_KEEP(sec)
-#define DEV_DISCARD(sec) *(.dev##sec)
-#endif
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define CPU_KEEP(sec)    *(.cpu##sec)
-#define CPU_DISCARD(sec)
-#else
-#define CPU_KEEP(sec)
-#define CPU_DISCARD(sec) *(.cpu##sec)
-#endif
-
-#if defined(CONFIG_MEMORY_HOTPLUG)
-#define MEM_KEEP(sec)    *(.mem##sec)
-#define MEM_DISCARD(sec)
-#else
-#define MEM_KEEP(sec)
-#define MEM_DISCARD(sec) *(.mem##sec)
-#endif
-
-
 /* .data section */
 #define DATA_DATA                                                      \
        *(.data)                                                        \
        *(.data.init.refok)                                             \
        *(.ref.data)                                                    \
-       DEV_KEEP(init.data)                                             \
-       DEV_KEEP(exit.data)                                             \
-       CPU_KEEP(init.data)                                             \
-       CPU_KEEP(exit.data)                                             \
-       MEM_KEEP(init.data)                                             \
-       MEM_KEEP(exit.data)                                             \
+       *(.devinit.data)                                                \
+       *(.devexit.data)                                                \
+       *(.cpuinit.data)                                                \
+       *(.cpuexit.data)                                                \
+       *(.meminit.data)                                                \
+       *(.memexit.data)                                                \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__start___markers) = .;                          \
        *(__markers)                                                    \
@@ -171,12 +142,12 @@
        /* __*init sections */                                          \
        __init_rodata : AT(ADDR(__init_rodata) - LOAD_OFFSET) {         \
                *(.ref.rodata)                                          \
-               DEV_KEEP(init.rodata)                                   \
-               DEV_KEEP(exit.rodata)                                   \
-               CPU_KEEP(init.rodata)                                   \
-               CPU_KEEP(exit.rodata)                                   \
-               MEM_KEEP(init.rodata)                                   \
-               MEM_KEEP(exit.rodata)                                   \
+               *(.devinit.rodata)                                      \
+               *(.devexit.rodata)                                      \
+               *(.cpuinit.rodata)                                      \
+               *(.cpuexit.rodata)                                      \
+               *(.meminit.rodata)                                      \
+               *(.memexit.rodata)                                      \
        }                                                               \
                                                                        \
        /* Built-in module parameters. */                               \
@@ -208,12 +179,12 @@
                *(.ref.text)                                            \
                *(.text.init.refok)                                     \
                *(.exit.text.refok)                                     \
-       DEV_KEEP(init.text)                                             \
-       DEV_KEEP(exit.text)                                             \
-       CPU_KEEP(init.text)                                             \
-       CPU_KEEP(exit.text)                                             \
-       MEM_KEEP(init.text)                                             \
-       MEM_KEEP(exit.text)
+       *(.devinit.text)                                                \
+       *(.devexit.text)                                                \
+       *(.cpuinit.text)                                                \
+       *(.cpuexit.text)                                                \
+       *(.meminit.text)                                                \
+       *(.memexit.text)
 
 
 /* sched.text is aling to function alignment to secure we have same
@@ -242,35 +213,10 @@
 #define HEAD_TEXT  *(.head.text)
 
 /* init and exit section handling */
-#define INIT_DATA                                                      \
-       *(.init.data)                                                   \
-       DEV_DISCARD(init.data)                                          \
-       DEV_DISCARD(init.rodata)                                        \
-       CPU_DISCARD(init.data)                                          \
-       CPU_DISCARD(init.rodata)                                        \
-       MEM_DISCARD(init.data)                                          \
-       MEM_DISCARD(init.rodata)
-
-#define INIT_TEXT                                                      \
-       *(.init.text)                                                   \
-       DEV_DISCARD(init.text)                                          \
-       CPU_DISCARD(init.text)                                          \
-       MEM_DISCARD(init.text)
-
-#define EXIT_DATA                                                      \
-       *(.exit.data)                                                   \
-       DEV_DISCARD(exit.data)                                          \
-       DEV_DISCARD(exit.rodata)                                        \
-       CPU_DISCARD(exit.data)                                          \
-       CPU_DISCARD(exit.rodata)                                        \
-       MEM_DISCARD(exit.data)                                          \
-       MEM_DISCARD(exit.rodata)
-
-#define EXIT_TEXT                                                      \
-       *(.exit.text)                                                   \
-       DEV_DISCARD(exit.text)                                          \
-       CPU_DISCARD(exit.text)                                          \
-       MEM_DISCARD(exit.text)
+#define INIT_DATA      *(.init.data)
+#define INIT_TEXT      *(.init.text)
+#define EXIT_DATA      *(.exit.data)
+#define EXIT_TEXT      *(.exit.text)
 
                /* DWARF debug sections.
                Symbols in the DWARF debugging sections are relative to
diff --git a/include/linux/init.h b/include/linux/init.h
index fb58c04..8461f8f 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -83,28 +83,55 @@
 #define __exit          __section(.exit.text) __exitused __cold
 
 /* Used for HOTPLUG */
+#if defined(MODULE) || defined(CONFIG_HOTPLUG)
 #define __devinit        __section(.devinit.text) __cold
 #define __devinitdata    __section(.devinit.data)
 #define __devinitconst   __section(.devinit.rodata)
 #define __devexit        __section(.devexit.text) __exitused __cold
 #define __devexitdata    __section(.devexit.data)
 #define __devexitconst   __section(.devexit.rodata)
+#else
+#define __devinit        __section(.init.text) __cold
+#define __devinitdata    __section(.init.data)
+#define __devinitconst   __section(.init.rodata)
+#define __devexit        __section(.exit.text) __exitused __cold
+#define __devexitdata    __section(.exit.data)
+#define __devexitconst   __section(.exit.rodata)
+#endif
 
 /* Used for HOTPLUG_CPU */
+#if defined(MODULE) || defined(CONFIG_HOTPLUG_CPU)
 #define __cpuinit        __section(.cpuinit.text) __cold
 #define __cpuinitdata    __section(.cpuinit.data)
 #define __cpuinitconst   __section(.cpuinit.rodata)
 #define __cpuexit        __section(.cpuexit.text) __exitused __cold
 #define __cpuexitdata    __section(.cpuexit.data)
 #define __cpuexitconst   __section(.cpuexit.rodata)
+#else
+#define __cpuinit        __section(.init.text) __cold
+#define __cpuinitdata    __section(.init.data)
+#define __cpuinitconst   __section(.init.rodata)
+#define __cpuexit        __section(.exit.text) __exitused __cold
+#define __cpuexitdata    __section(.exit.data)
+#define __cpuexitconst   __section(.exit.rodata)
+#endif
 
 /* Used for MEMORY_HOTPLUG */
+#if defined(MODULE) || defined(CONFIG_MEMORY_HOTPLUG)
 #define __meminit        __section(.meminit.text) __cold
 #define __meminitdata    __section(.meminit.data)
 #define __meminitconst   __section(.meminit.rodata)
 #define __memexit        __section(.memexit.text) __exitused __cold
 #define __memexitdata    __section(.memexit.data)
 #define __memexitconst   __section(.memexit.rodata)
+#else
+#define __meminit        __section(.init.text) __cold
+#define __meminitdata    __section(.init.data)
+#define __meminitconst   __section(.init.rodata)
+#define __memexit        __section(.exit.text) __exitused __cold
+#define __memexitdata    __section(.exit.data)
+#define __memexitconst   __section(.exit.rodata)
+#endif
 
 /* For assembly routines */
 #define __HEAD         .section        ".head.text","ax"
--
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/

Reply via email to