kbuild: introduce __init_refok/__initdata_refok to supress section mismatch warnings
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>
This commit is contained in:
parent
ca967258b6
commit
0e0d314e6a
|
@ -11,7 +11,8 @@
|
||||||
|
|
||||||
/* .data section */
|
/* .data section */
|
||||||
#define DATA_DATA \
|
#define DATA_DATA \
|
||||||
*(.data)
|
*(.data) \
|
||||||
|
*(.data.init.refok)
|
||||||
|
|
||||||
#define RODATA \
|
#define RODATA \
|
||||||
. = ALIGN(4096); \
|
. = ALIGN(4096); \
|
||||||
|
@ -147,7 +148,8 @@
|
||||||
* during second ld run in second ld pass when generating System.map */
|
* during second ld run in second ld pass when generating System.map */
|
||||||
#define TEXT_TEXT \
|
#define TEXT_TEXT \
|
||||||
ALIGN_FUNCTION(); \
|
ALIGN_FUNCTION(); \
|
||||||
*(.text)
|
*(.text) \
|
||||||
|
*(.text.init.refok)
|
||||||
|
|
||||||
/* sched.text is aling to function alignment to secure we have same
|
/* sched.text is aling to function alignment to secure we have same
|
||||||
* address even at second ld pass when generating System.map */
|
* address even at second ld pass when generating System.map */
|
||||||
|
|
|
@ -45,6 +45,19 @@
|
||||||
#define __exitdata __attribute__ ((__section__(".exit.data")))
|
#define __exitdata __attribute__ ((__section__(".exit.data")))
|
||||||
#define __exit_call __attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
|
#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
|
#ifdef MODULE
|
||||||
#define __exit __attribute__ ((__section__(".exit.text")))
|
#define __exit __attribute__ ((__section__(".exit.text")))
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -583,6 +583,12 @@ static int strrcmp(const char *s, const char *sub)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whitelist to allow certain references to pass with no warning.
|
* 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:
|
* Pattern 1:
|
||||||
* If a module parameter is declared __initdata and permissions=0
|
* If a module parameter is declared __initdata and permissions=0
|
||||||
* then this is legal despite the warning generated.
|
* then this is legal despite the warning generated.
|
||||||
|
@ -686,6 +692,11 @@ static int secref_whitelist(const char *modname, const char *tosec,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Check for pattern 0 */
|
||||||
|
if ((strcmp(fromsec, ".text.init.refok") == 0) ||
|
||||||
|
(strcmp(fromsec, ".data.init.refok") == 0))
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* Check for pattern 1 */
|
/* Check for pattern 1 */
|
||||||
if (strcmp(tosec, ".init.data") != 0)
|
if (strcmp(tosec, ".init.data") != 0)
|
||||||
f1 = 0;
|
f1 = 0;
|
||||||
|
|
Loading…
Reference in New Issue