[PATCH RFC v2 04/13] sysctl: add register_sysctl() wrapper for MODULE_SYSCTL_TABLE
Mauricio Faria de Oliveira
mfo at igalia.com
Tue Aug 18 19:28:03 PDT 2026
Add a MODULE_SYSCTL_TABLE call into register_sysctl() for existing callers
to automatically use it.
Add optional 'template arguments' to support a dynamic table/path defined
at run-time based on a 'template' table/path available at build-time.
Split the update of callers with template arguments into another commit for
clarity, disabling them for now.
Note: there is no register_sysctl_sz() wrapper, as it is used in even more
dynamic cases (e.g., table generated at run-time not based on a template).
Signed-off-by: Mauricio Faria de Oliveira <mfo at igalia.com>
---
drivers/parport/procfs.c | 2 ++
include/linux/sysctl.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c
index 3880460e67f25a7d8708a734c6f4d9e6c363c726..cda3221e386ed7a4afc898b3d0313081dee5b49b 100644
--- a/drivers/parport/procfs.c
+++ b/drivers/parport/procfs.c
@@ -13,6 +13,8 @@
* Cleaned up include files - Russell King <linux at arm.uk.linux.org>
*/
+#define SYSCTL_MODULE_ALIASES_DISABLE
+
#include <linux/string.h>
#include <linux/init.h>
#include <linux/module.h>
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index 6960fe22c50bfd8a9acc79870e494c2775fa040a..7e05fafd5544e1c4a3283dc13b0692f39515d01e 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -335,8 +335,58 @@ struct ctl_table_root {
#define MODULE_SYSCTL_TABLE(path, table)
#endif
-#define register_sysctl(path, table) \
- register_sysctl_sz(path, table, ARRAY_SIZE(table))
+/*
+ * The register_sysctl() wrapper for the MODULE_SYSCTL_TABLE macro
+ * automatically creates symbols in sysctl table registration sites.
+ *
+ * Usage:
+ * - register_sysctl(path, table);
+ * - register_sysctl(path, table, table_tmpl);
+ * - register_sysctl(path, table, table_tmpl, path_tmpl);
+ *
+ * The optional 'template arguments' ('table_tmpl' and 'path_tmpl')
+ * can support callers with non-static variables: dynamic table/path
+ * defined at run-time based on a 'template' available at build-time.
+ *
+ * For example, a sysctl table, or table and path, which is/are:
+ *
+ * - per-namespace: different tables based on a template table
+ * (i.e., same files in each namespace) with identical path
+ * (i.e., same path in each namespace).
+ *
+ * - per-device: different tables based on a template table
+ * (i.e., same files for each device) with different paths
+ * (i.e., diff paths for each device) based on a template path.
+ *
+ * The wrapper passes the build-time parameters (templates) to the macro
+ * and the dynamic/run-time parameters (instances) to the wrapped function.
+ *
+ * The wrapper reduces to the wrapped function when either the macro or the
+ * config option is disabled.
+ */
+#define _register_sysctl(path, table, table_tmpl, path_tmpl) \
+({ \
+ MODULE_SYSCTL_TABLE(path_tmpl, table_tmpl); \
+ register_sysctl_sz(path, table, ARRAY_SIZE(table)); \
+})
+
+#define register_sysctl(path, table, tmpl_args...) \
+ _register_sysctl(path, table, \
+ __sysctl_table_tmpl_or_default(table, ## tmpl_args), \
+ __sysctl_path_tmpl_or_default(path, ## tmpl_args)) \
+
+/* Helper macros for optional template arguments */
+#define __sysctl_table_tmpl(skip, table_tmpl, ...) \
+ table_tmpl
+
+#define __sysctl_path_tmpl(skip, table_tmpl, path_tmpl, ...) \
+ path_tmpl
+
+#define __sysctl_table_tmpl_or_default(default, tmpl_args...) \
+ __sysctl_table_tmpl(, ## tmpl_args, default)
+
+#define __sysctl_path_tmpl_or_default(default, tmpl_args...) \
+ __sysctl_path_tmpl(, ## tmpl_args, default, default)
#ifdef CONFIG_SYSCTL
--
2.47.3
More information about the linux-riscv
mailing list