kbuild: introduce __init_refok/__initdata_refok to supress section mismatch warnings
authorSam Ravnborg <sam@ravnborg.org>
Thu, 17 May 2007 18:14:48 +0000 (20:14 +0200)
committerSam Ravnborg <sam@ravnborg.org>
Sat, 19 May 2007 07:11:58 +0000 (09:11 +0200)
Throughout the kernel there are a few legitimite references
to init or exit sections. Most of these are covered by the
patterns included in modpost but a few nees special attention.
To avoid hardcoding a lot of function names in modpost introduce
a marker so relevant function/data can be marked.
When modpost see a reference to a init/exit function from
a function/data marked no warning will be issued.

Idea from: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
include/asm-generic/vmlinux.lds.h
include/linux/init.h
scripts/mod/modpost.c

index 52e2d69ee535ec664ffe5422e58b9af0281ad1b6..8307b1bb337a055d123c1d6fa4fc2c48d9815604 100644 (file)
@@ -11,7 +11,8 @@
 
 /* .data section */
 #define DATA_DATA                                                      \
-       *(.data)
+       *(.data)                                                        \
+       *(.data.init.refok)
 
 #define RODATA                                                         \
        . = ALIGN(4096);                                                \
  * during second ld run in second ld pass when generating System.map */
 #define TEXT_TEXT                                                      \
                ALIGN_FUNCTION();                                       \
-               *(.text)
+               *(.text)                                                \
+               *(.text.init.refok)
 
 /* sched.text is aling to function alignment to secure we have same
  * address even at second ld pass when generating System.map */
index e007ae4dc41e7c553fe44aaea3a11dc81f1a9779..56ec4c62eee066d6886ec2f0bfe96fa273368785 100644 (file)
 #define __exitdata     __attribute__ ((__section__(".exit.data")))
 #define __exit_call    __attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
 
+/* modpost check for section mismatches during the kernel build.
+ * A section mismatch happens when there are references from a
+ * code or data section to an init section (both code or data).
+ * The init sections are (for most archs) discarded by the kernel
+ * when early init has completed so all such references are potential bugs.
+ * For exit sections the same issue exists.
+ * The following markers are used for the cases where the reference to
+ * the init/exit section (code or data) is valid and will teach modpost
+ * not to issue a warning.
+ * The markers follow same syntax rules as __init / __initdata. */
+#define __init_refok     noinline __attribute__ ((__section__ (".text.init.refok")))
+#define __initdata_refok          __attribute__ ((__section__ (".data.init.refok")))
+
 #ifdef MODULE
 #define __exit         __attribute__ ((__section__(".exit.text")))
 #else
index 2909391a8035ea54845ac9301ceeea96e5fd69d3..7c87267b6ff0c72c62be5e1b70dc5ea80b3185c5 100644 (file)
@@ -583,6 +583,12 @@ static int strrcmp(const char *s, const char *sub)
 
 /**
  * Whitelist to allow certain references to pass with no warning.
+ *
+ * Pattern 0:
+ *   Do not warn if funtion/data are marked with __init_refok/__initdata_refok.
+ *   The pattern is identified by:
+ *   fromsec = .text.init.refok | .data.init.refok
+ *
  * Pattern 1:
  *   If a module parameter is declared __initdata and permissions=0
  *   then this is legal despite the warning generated.
@@ -686,6 +692,11 @@ static int secref_whitelist(const char *modname, const char *tosec,
                NULL
        };
 
+       /* Check for pattern 0 */
+       if ((strcmp(fromsec, ".text.init.refok") == 0) ||
+           (strcmp(fromsec, ".data.init.refok") == 0))
+               return 1;
+
        /* Check for pattern 1 */
        if (strcmp(tosec, ".init.data") != 0)
                f1 = 0;