Thread (6 messages) 6 messages, 3 authors, 5d ago

Re: [PATCH v6 1/2] module: Extend module_blacklist parameter to built-in modules

From: Aaron Tomlin <atomlin@atomlin.com>
Date: 2026-07-24 00:47:03
Also in: linux-arch, lkml

On Wed, Jul 22, 2026 at 03:57:54PM +0200, Petr Pavlu wrote:
quoted
diff --git a/include/linux/init.h b/include/linux/init.h
index 40331923b9f4..1cf163715264 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -271,7 +271,28 @@ extern struct module __this_module;
 		__initcall_name(initcall, __iid, id),		\
 		__initcall_section(__sec, __iid))
 
-#define ___define_initcall(fn, id, __sec)			\
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
+#define __initcall_fn_ptr(fn, __iid, id)	__initcall_stub(fn, __iid, id)
+#else
+#define __initcall_fn_ptr(fn, __iid, id)	fn
+#endif
Nit: I suggest moving the __initcall_fn_ptr() definition into the
existing '#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS' block that defines
____define_initcall() to make the code shorter and group the related
implementations.
Hi Petr,

Thanks for the thorough review.

Done. Moved __initcall_fn_ptr() into the existing #ifdef block in init.h.
quoted
diff --git a/include/linux/module.h b/include/linux/module.h
index 7566815fabbe..fc1525e8f63c 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -86,7 +86,8 @@ extern void cleanup_module(void);
  * builtin) or at module insertion time (if a module).  There can only
  * be one per module.
  */
-#define module_init(x)	__initcall(x);
+#define module_init(initfn)					\
+	____define_initcall_modname(initfn, 6, .initcall6, __initcall_id(initfn))
The initcall numbering and section naming should remain defined only in
one place, in include/linux/init.h.

Could something like the following work?

In include/linux/module.h:

#define module_init(initfn) __builtin_module_initcall(initfn);

In include/linux/init.h:

#define __define_initcall_modname(fn, id)				\
	__define_initcall(fn, id)					\
	static const char __initstr_##fn[] __used __aligned(1)		\
		__section(".init.rodata") = KBUILD_MODNAME;		\
	static const struct initcall_modname __modname_##fn __used	\
		__section(".initcall.modnames") = {			\
			.initcall_fn = __initcall_fn_ptr(		\
			    fn, .initcall##id, id),			\
			.modname = __initstr_##fn			\
		};

#define __builtin_module_initcall(fn)	__define_initcall_modname(fn, 6)
Adopted this suggestion. This keeps the initcall section naming and level
numbering localised strictly to include/linux/init.h.
quoted
+static const char *__init get_builtin_modname(initcall_t fn)
+{
+	struct initcall_modname *p;
+
+	for (p = __start_initcall_modnames; p < __stop_initcall_modnames; p++) {
+		if (dereference_function_descriptor(p->initcall_fn) ==
+		    dereference_function_descriptor(fn))
Using dereference_function_descriptor() looks unnecessary.
Agreed, removed dereference_function_descriptor() in get_builtin_modname()
and switched to direct pointer comparison.
Nit: This hunk leaves three consecutive blank lines after
module_frob_arch_sections().
Acknowledged.

I will include these updates in v7.


Kind regards,
-- 
Aaron Tomlin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help