2022-03-01 12:43:56 +03:00
// SPDX-License-Identifier: GPL-2.0
/*
* Shared Memory Communications over RDMA ( SMC - R ) and RoCE
*
* smc_sysctl . c : sysctl interface to SMC subsystem .
*
* Copyright ( c ) 2022 , Alibaba Inc .
*
* Author : Tony Lu < tonylu @ linux . alibaba . com >
*
*/
# include <linux/init.h>
# include <linux/sysctl.h>
# include <net/net_namespace.h>
2022-03-01 12:43:58 +03:00
# include "smc.h"
2022-07-14 12:44:02 +03:00
# include "smc_core.h"
2022-09-20 12:52:21 +03:00
# include "smc_llc.h"
2022-03-01 12:43:56 +03:00
# include "smc_sysctl.h"
2022-09-20 12:52:22 +03:00
static int min_sndbuf = SMC_BUF_MIN_SIZE ;
static int min_rcvbuf = SMC_BUF_MIN_SIZE ;
2022-03-01 12:43:56 +03:00
static struct ctl_table smc_table [ ] = {
2022-03-01 12:43:58 +03:00
{
. procname = " autocorking_size " ,
. data = & init_net . smc . sysctl_autocorking_size ,
. maxlen = sizeof ( unsigned int ) ,
. mode = 0644 ,
. proc_handler = proc_douintvec ,
} ,
2022-07-14 12:44:02 +03:00
{
. procname = " smcr_buf_type " ,
. data = & init_net . smc . sysctl_smcr_buf_type ,
. maxlen = sizeof ( unsigned int ) ,
. mode = 0644 ,
. proc_handler = proc_douintvec_minmax ,
. extra1 = SYSCTL_ZERO ,
. extra2 = SYSCTL_TWO ,
} ,
2022-09-20 12:52:21 +03:00
{
. procname = " smcr_testlink_time " ,
. data = & init_net . smc . sysctl_smcr_testlink_time ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec_jiffies ,
} ,
2022-09-20 12:52:22 +03:00
{
. procname = " wmem " ,
. data = & init_net . smc . sysctl_wmem ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec_minmax ,
. extra1 = & min_sndbuf ,
} ,
{
. procname = " rmem " ,
. data = & init_net . smc . sysctl_rmem ,
. maxlen = sizeof ( int ) ,
. mode = 0644 ,
. proc_handler = proc_dointvec_minmax ,
. extra1 = & min_rcvbuf ,
} ,
2022-03-01 12:43:56 +03:00
{ }
} ;
2022-03-07 04:54:24 +03:00
int __net_init smc_sysctl_net_init ( struct net * net )
2022-03-01 12:43:56 +03:00
{
struct ctl_table * table ;
table = smc_table ;
if ( ! net_eq ( net , & init_net ) ) {
int i ;
table = kmemdup ( table , sizeof ( smc_table ) , GFP_KERNEL ) ;
if ( ! table )
goto err_alloc ;
for ( i = 0 ; i < ARRAY_SIZE ( smc_table ) - 1 ; i + + )
table [ i ] . data + = ( void * ) net - ( void * ) & init_net ;
}
net - > smc . smc_hdr = register_net_sysctl ( net , " net/smc " , table ) ;
if ( ! net - > smc . smc_hdr )
goto err_reg ;
2022-03-01 12:43:58 +03:00
net - > smc . sysctl_autocorking_size = SMC_AUTOCORKING_DEFAULT_SIZE ;
2022-07-14 12:44:02 +03:00
net - > smc . sysctl_smcr_buf_type = SMCR_PHYS_CONT_BUFS ;
2022-09-20 12:52:21 +03:00
net - > smc . sysctl_smcr_testlink_time = SMC_LLC_TESTLINK_DEFAULT_TIME ;
2022-09-20 12:52:22 +03:00
WRITE_ONCE ( net - > smc . sysctl_wmem , READ_ONCE ( net - > ipv4 . sysctl_tcp_wmem [ 1 ] ) ) ;
WRITE_ONCE ( net - > smc . sysctl_rmem , READ_ONCE ( net - > ipv4 . sysctl_tcp_rmem [ 1 ] ) ) ;
2022-03-01 12:43:58 +03:00
2022-03-01 12:43:56 +03:00
return 0 ;
err_reg :
if ( ! net_eq ( net , & init_net ) )
kfree ( table ) ;
err_alloc :
return - ENOMEM ;
}
2022-03-07 04:54:24 +03:00
void __net_exit smc_sysctl_net_exit ( struct net * net )
2022-03-01 12:43:56 +03:00
{
2022-03-25 19:50:21 +03:00
struct ctl_table * table ;
table = net - > smc . smc_hdr - > ctl_table_arg ;
2022-03-01 12:43:56 +03:00
unregister_net_sysctl_table ( net - > smc . smc_hdr ) ;
2022-03-25 19:50:21 +03:00
if ( ! net_eq ( net , & init_net ) )
kfree ( table ) ;
2022-03-01 12:43:56 +03:00
}