mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
net/rds: do not fail init when CONFIG_SYSCTL=n
With CONFIG_SYSCTL=n, register_net_sysctl() and register_net_sysctl_sz() are inline stubs that return NULL. rds_sysctl_init(), rds_ib_sysctl_init() and rds_tcp_init_net() all treat that NULL as -ENOMEM, so RDS refuses to initialize at all even though every tunable has a sane compiled-in default. When RDS is built in, that is worse than a missing feature: the failed rds_init() destroys rds_wq, but the rds_rdma initcall still runs, and when rds_ib_sysctl_init() fails the same way, the error path in rds_ib_init() flushes the already freed workqueue: BUG: KASAN: slab-use-after-free in touch_wq_lockdep_map ... __flush_workqueue rds_ib_init rds_rdma_init ... Allocated by task 1: alloc_workqueue_noprof rds_threads_init rds_init ... Freed by task 0: kfree rcu_do_batch Only treat the NULL return as a failure when sysctl support is actually compiled in. The exit paths need no change: unregister_net_sysctl_table() is an empty stub with CONFIG_SYSCTL=n and already tolerates a NULL header otherwise. The underlying problem of built-in transports initializing after rds_init() has failed is independent of sysctl and is addressed separately. Reported-by: kernel test robot <yi1.lai@intel.com> Closes: https://lore.kernel.org/oe-lkp/202610190310.9737b2e3-lkp@intel.com Fixes:3e5048495c("RDS: sysctls") Fixes:e6babe4cc4("RDS/IB: Stats and sysctls") Fixes:c6a58ffed5("RDS: TCP: Add sysctl tunables for sndbuf/rcvbuf on rds-tcp socket") Suggested-by: Joel Granados <joel.granados@kernel.org> Signed-off-by: Allison Henderson <achender@kernel.org> Reviewed-by: Joel Granados <joel.granados@kernel.org> Acked-by: Oleg Nesterov <oleg@redhat.com> Link: https://patch.msgid.link/20261021195837.142802-2-achender@kernel.org Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
a58b221496
commit
fbea154a86
|
|
@ -114,7 +114,7 @@ void rds_ib_sysctl_exit(void)
|
|||
int rds_ib_sysctl_init(void)
|
||||
{
|
||||
rds_ib_sysctl_hdr = register_net_sysctl(&init_net, "net/rds/ib", rds_ib_sysctl_table);
|
||||
if (!rds_ib_sysctl_hdr)
|
||||
if (!rds_ib_sysctl_hdr && IS_ENABLED(CONFIG_SYSCTL))
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ int rds_sysctl_init(void)
|
|||
|
||||
rds_sysctl_reg_table =
|
||||
register_net_sysctl(&init_net, "net/rds", rds_sysctl_rds_table);
|
||||
if (!rds_sysctl_reg_table)
|
||||
if (!rds_sysctl_reg_table && IS_ENABLED(CONFIG_SYSCTL))
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -637,7 +637,7 @@ static __net_init int rds_tcp_init_net(struct net *net)
|
|||
tbl[RDS_TCP_RCVBUF].data = &rtn->rcvbuf_size;
|
||||
rtn->rds_tcp_sysctl = register_net_sysctl_sz(net, "net/rds/tcp", tbl,
|
||||
ARRAY_SIZE(rds_tcp_sysctl_table));
|
||||
if (!rtn->rds_tcp_sysctl) {
|
||||
if (!rtn->rds_tcp_sysctl && IS_ENABLED(CONFIG_SYSCTL)) {
|
||||
pr_warn("could not register sysctl\n");
|
||||
err = -ENOMEM;
|
||||
goto fail;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user