forked from mirrors/linux
		
	net/smc: add sysctl interface for SMC
This patch add sysctl interface to support container environment for SMC as we talk in the mail list. Link: https://lore.kernel.org/netdev/20220224020253.GF5443@linux.alibaba.com Co-developed-by: Tony Lu <tonylu@linux.alibaba.com> Signed-off-by: Tony Lu <tonylu@linux.alibaba.com> Signed-off-by: Dust Li <dust.li@linux.alibaba.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									1e385c0824
								
							
						
					
					
						commit
						462791bbfa
					
				
					 5 changed files with 116 additions and 1 deletions
				
			
		|  | @ -14,5 +14,8 @@ struct netns_smc { | |||
| 	struct smc_stats_rsn		*fback_rsn; | ||||
| 
 | ||||
| 	bool				limit_smc_hs;	/* constraint on handshake */ | ||||
| #ifdef CONFIG_SYSCTL | ||||
| 	struct ctl_table_header		*smc_hdr; | ||||
| #endif | ||||
| }; | ||||
| #endif | ||||
|  |  | |||
|  | @ -4,4 +4,4 @@ obj-$(CONFIG_SMC)	+= smc.o | |||
| obj-$(CONFIG_SMC_DIAG)	+= smc_diag.o | ||||
| smc-y := af_smc.o smc_pnet.o smc_ib.o smc_clc.o smc_core.o smc_wr.o smc_llc.o | ||||
| smc-y += smc_cdc.o smc_tx.o smc_rx.o smc_close.o smc_ism.o smc_netlink.o smc_stats.o | ||||
| smc-y += smc_tracepoint.o | ||||
| smc-y += smc_tracepoint.o smc_sysctl.o | ||||
|  |  | |||
|  | @ -51,6 +51,7 @@ | |||
| #include "smc_close.h" | ||||
| #include "smc_stats.h" | ||||
| #include "smc_tracepoint.h" | ||||
| #include "smc_sysctl.h" | ||||
| 
 | ||||
| static DEFINE_MUTEX(smc_server_lgr_pending);	/* serialize link group
 | ||||
| 						 * creation on server | ||||
|  | @ -3273,9 +3274,17 @@ static int __init smc_init(void) | |||
| 		goto out_sock; | ||||
| 	} | ||||
| 
 | ||||
| 	rc = smc_sysctl_init(); | ||||
| 	if (rc) { | ||||
| 		pr_err("%s: sysctl_init fails with %d\n", __func__, rc); | ||||
| 		goto out_ulp; | ||||
| 	} | ||||
| 
 | ||||
| 	static_branch_enable(&tcp_have_smc); | ||||
| 	return 0; | ||||
| 
 | ||||
| out_ulp: | ||||
| 	tcp_unregister_ulp(&smc_ulp_ops); | ||||
| out_sock: | ||||
| 	sock_unregister(PF_SMC); | ||||
| out_proto6: | ||||
|  | @ -3303,6 +3312,7 @@ static int __init smc_init(void) | |||
| static void __exit smc_exit(void) | ||||
| { | ||||
| 	static_branch_disable(&tcp_have_smc); | ||||
| 	smc_sysctl_exit(); | ||||
| 	tcp_unregister_ulp(&smc_ulp_ops); | ||||
| 	sock_unregister(PF_SMC); | ||||
| 	smc_core_exit(); | ||||
|  |  | |||
							
								
								
									
										70
									
								
								net/smc/smc_sysctl.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								net/smc/smc_sysctl.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | |||
| // 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> | ||||
| 
 | ||||
| #include "smc_sysctl.h" | ||||
| 
 | ||||
| static struct ctl_table smc_table[] = { | ||||
| 	{  } | ||||
| }; | ||||
| 
 | ||||
| static __net_init int smc_sysctl_init_net(struct net *net) | ||||
| { | ||||
| 	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; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_reg: | ||||
| 	if (!net_eq(net, &init_net)) | ||||
| 		kfree(table); | ||||
| err_alloc: | ||||
| 	return -ENOMEM; | ||||
| } | ||||
| 
 | ||||
| static __net_exit void smc_sysctl_exit_net(struct net *net) | ||||
| { | ||||
| 	unregister_net_sysctl_table(net->smc.smc_hdr); | ||||
| } | ||||
| 
 | ||||
| static struct pernet_operations smc_sysctl_ops __net_initdata = { | ||||
| 	.init = smc_sysctl_init_net, | ||||
| 	.exit = smc_sysctl_exit_net, | ||||
| }; | ||||
| 
 | ||||
| int __init smc_sysctl_init(void) | ||||
| { | ||||
| 	return register_pernet_subsys(&smc_sysctl_ops); | ||||
| } | ||||
| 
 | ||||
| void smc_sysctl_exit(void) | ||||
| { | ||||
| 	unregister_pernet_subsys(&smc_sysctl_ops); | ||||
| } | ||||
							
								
								
									
										32
									
								
								net/smc/smc_sysctl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								net/smc/smc_sysctl.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| /* 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> | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _SMC_SYSCTL_H | ||||
| #define _SMC_SYSCTL_H | ||||
| 
 | ||||
| #ifdef CONFIG_SYSCTL | ||||
| 
 | ||||
| int smc_sysctl_init(void); | ||||
| void smc_sysctl_exit(void); | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| int smc_sysctl_init(void) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void smc_sysctl_exit(void) { } | ||||
| 
 | ||||
| #endif /* CONFIG_SYSCTL */ | ||||
| 
 | ||||
| #endif /* _SMC_SYSCTL_H */ | ||||
		Loading…
	
		Reference in a new issue
	
	 Dust Li
						Dust Li