Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e0d314e authored by Sam Ravnborg's avatar Sam Ravnborg
Browse files

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: default avatarSam Ravnborg <sam@ravnborg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
parent ca967258
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -11,7 +11,8 @@

/* .data section */
#define DATA_DATA							\
	*(.data)
	*(.data)							\
	*(.data.init.refok)

#define RODATA								\
	. = ALIGN(4096);						\
@@ -147,7 +148,8 @@
 * 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 */
+13 −0
Original line number Diff line number Diff line
@@ -45,6 +45,19 @@
#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
+11 −0
Original line number Diff line number Diff line
@@ -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;