[RFC PATCH 16/39] sysctl: store RPC sysctl bounds by value

From: wen . yang

Date: Wed Oct 28 2026 - 12:46:32 EST


From: Wen Yang <wen.yang@xxxxxxxxx>

Replace RPC bound pointers with numeric limits.

Suggested-by: Joel Granados <joel.granados@xxxxxxxxxx>
Signed-off-by: Wen Yang <wen.yang@xxxxxxxxx>
---
net/sunrpc/xprtrdma/svc_rdma.c | 39 ++++++++++++++-------------------
net/sunrpc/xprtrdma/transport.c | 27 +++++++++--------------
net/sunrpc/xprtsock.c | 26 +++++++++-------------
3 files changed, 36 insertions(+), 56 deletions(-)

diff --git a/net/sunrpc/xprtrdma/svc_rdma.c b/net/sunrpc/xprtrdma/svc_rdma.c
index f67f0612b1a9..0ba54bf6bc7c 100644
--- a/net/sunrpc/xprtrdma/svc_rdma.c
+++ b/net/sunrpc/xprtrdma/svc_rdma.c
@@ -53,17 +53,10 @@

/* RPC/RDMA parameters */
unsigned int svcrdma_ord = 16; /* historical default */
-static unsigned int min_ord = 1;
-static unsigned int max_ord = 255;
unsigned int svcrdma_max_requests = RPCRDMA_MAX_REQUESTS;
unsigned int svcrdma_max_bc_requests = RPCRDMA_MAX_BC_REQUESTS;
-static unsigned int min_max_requests = 4;
-static unsigned int max_max_requests = 16384;
unsigned int svcrdma_max_req_size = RPCRDMA_DEF_INLINE_THRESH;
-static unsigned int min_max_inline = RPCRDMA_DEF_INLINE_THRESH;
-static unsigned int max_max_inline = RPCRDMA_MAX_INLINE_THRESH;
static unsigned int svcrdma_stat_unused;
-static unsigned int zero;

struct percpu_counter svcrdma_stat_read;
struct percpu_counter svcrdma_stat_recv;
@@ -114,8 +107,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_max_requests,
- .extra2 = &max_max_requests
+ .min = 4,
+ .max = 16384
},
{
.procname = "max_req_size",
@@ -123,8 +116,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_max_inline,
- .extra2 = &max_max_inline
+ .min = RPCRDMA_DEF_INLINE_THRESH,
+ .max = RPCRDMA_MAX_INLINE_THRESH
},
{
.procname = "max_outbound_read_requests",
@@ -132,8 +125,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_ord,
- .extra2 = &max_ord,
+ .min = 1,
+ .max = 255,
},

{
@@ -170,8 +163,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &zero,
- .extra2 = &zero,
+ .min = 0,
+ .max = 0,
},
{
.procname = "rdma_stat_rq_poll",
@@ -179,8 +172,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &zero,
- .extra2 = &zero,
+ .min = 0,
+ .max = 0,
},
{
.procname = "rdma_stat_rq_prod",
@@ -188,8 +181,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &zero,
- .extra2 = &zero,
+ .min = 0,
+ .max = 0,
},
{
.procname = "rdma_stat_sq_poll",
@@ -197,8 +190,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &zero,
- .extra2 = &zero,
+ .min = 0,
+ .max = 0,
},
{
.procname = "rdma_stat_sq_prod",
@@ -206,8 +199,8 @@ static struct ctl_table svcrdma_parm_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &zero,
- .extra2 = &zero,
+ .min = 0,
+ .max = 0,
},
};

diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
index d4e6746d8ecd..ef84dde20228 100644
--- a/net/sunrpc/xprtrdma/transport.c
+++ b/net/sunrpc/xprtrdma/transport.c
@@ -73,13 +73,6 @@ static struct xprt_class xprt_rdma;

#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)

-static unsigned int min_slot_table_size = RPCRDMA_MIN_SLOT_TABLE;
-static unsigned int max_slot_table_size = RPCRDMA_MAX_SLOT_TABLE;
-static unsigned int min_inline_size = RPCRDMA_MIN_INLINE;
-static unsigned int max_inline_size = RPCRDMA_MAX_INLINE;
-static unsigned int max_padding = PAGE_SIZE;
-static unsigned int min_memreg = RPCRDMA_BOUNCEBUFFERS;
-static unsigned int max_memreg = RPCRDMA_LAST - 1;
static unsigned int dummy;

static struct ctl_table_header *sunrpc_table_header;
@@ -91,8 +84,8 @@ static struct ctl_table xr_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_slot_table_size,
- .extra2 = &max_slot_table_size
+ .min = RPCRDMA_MIN_SLOT_TABLE,
+ .max = RPCRDMA_MAX_SLOT_TABLE
},
{
.procname = "rdma_max_inline_read",
@@ -100,8 +93,8 @@ static struct ctl_table xr_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_inline_size,
- .extra2 = &max_inline_size,
+ .min = RPCRDMA_MIN_INLINE,
+ .max = RPCRDMA_MAX_INLINE,
},
{
.procname = "rdma_max_inline_write",
@@ -109,8 +102,8 @@ static struct ctl_table xr_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_inline_size,
- .extra2 = &max_inline_size,
+ .min = RPCRDMA_MIN_INLINE,
+ .max = RPCRDMA_MAX_INLINE,
},
{
.procname = "rdma_inline_write_padding",
@@ -118,8 +111,8 @@ static struct ctl_table xr_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = &max_padding,
+ .min = 0,
+ .max = PAGE_SIZE,
},
{
.procname = "rdma_memreg_strategy",
@@ -127,8 +120,8 @@ static struct ctl_table xr_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_memreg,
- .extra2 = &max_memreg,
+ .min = RPCRDMA_BOUNCEBUFFERS,
+ .max = RPCRDMA_LAST - 1,
},
{
.procname = "rdma_pad_optimize",
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 59e36f206ccf..a15f54bf2b3c 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -88,12 +88,6 @@ static unsigned int xs_tcp_fin_timeout __read_mostly = XS_TCP_LINGER_TO;
* someone else's file names!
*/

-static unsigned int min_slot_table_size = RPC_MIN_SLOT_TABLE;
-static unsigned int max_slot_table_size = RPC_MAX_SLOT_TABLE;
-static unsigned int max_tcp_slot_table_limit = RPC_MAX_SLOT_TABLE_LIMIT;
-static unsigned int xprt_min_resvport_limit = RPC_MIN_RESVPORT;
-static unsigned int xprt_max_resvport_limit = RPC_MAX_RESVPORT;
-
static struct ctl_table_header *sunrpc_table_header;

static struct xprt_class xs_local_transport;
@@ -113,8 +107,8 @@ static struct ctl_table xs_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_slot_table_size,
- .extra2 = &max_slot_table_size
+ .min = RPC_MIN_SLOT_TABLE,
+ .max = RPC_MAX_SLOT_TABLE
},
{
.procname = "tcp_slot_table_entries",
@@ -122,8 +116,8 @@ static struct ctl_table xs_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_slot_table_size,
- .extra2 = &max_slot_table_size
+ .min = RPC_MIN_SLOT_TABLE,
+ .max = RPC_MAX_SLOT_TABLE
},
{
.procname = "tcp_max_slot_table_entries",
@@ -131,8 +125,8 @@ static struct ctl_table xs_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &min_slot_table_size,
- .extra2 = &max_tcp_slot_table_limit
+ .min = RPC_MIN_SLOT_TABLE,
+ .max = RPC_MAX_SLOT_TABLE_LIMIT
},
{
.procname = "min_resvport",
@@ -140,8 +134,8 @@ static struct ctl_table xs_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &xprt_min_resvport_limit,
- .extra2 = &xprt_max_resvport_limit
+ .min = RPC_MIN_RESVPORT,
+ .max = RPC_MAX_RESVPORT
},
{
.procname = "max_resvport",
@@ -149,8 +143,8 @@ static struct ctl_table xs_tunables_table[] = {
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = &xprt_min_resvport_limit,
- .extra2 = &xprt_max_resvport_limit
+ .min = RPC_MIN_RESVPORT,
+ .max = RPC_MAX_RESVPORT
},
{
.procname = "tcp_fin_timeout",
--
2.25.1