[PATCH RFC v2 04/13] sysctl: add register_sysctl() wrapper for MODULE_SYSCTL_TABLE
Mauricio Faria de Oliveira <[email protected]>
| Newsgroups | org.kernel.vger.lvs-devel,dev.linux.lists.bridge,dev.linux.lists.fsverity,dev.linux.lists.mptcp,dev.linux.lists.virtualization,org.infradead.lists.linux-riscv,org.kernel.vger.bpf,org.kernel.vger.keyrings,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kbuild,org.kernel.vger.linux-kernel,org.kernel.vger.linux-rdma,org.kernel.vger.linux-s390,org.kernel.vger.linux-sctp,org.kernel.vger.linux-wpan,org.kernel.vger.netdev,org.kernel.vger.netfilter-devel |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> --- 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 <[email protected]> */ +#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