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; | 	struct smc_stats_rsn		*fback_rsn; | ||||||
| 
 | 
 | ||||||
| 	bool				limit_smc_hs;	/* constraint on handshake */ | 	bool				limit_smc_hs;	/* constraint on handshake */ | ||||||
|  | #ifdef CONFIG_SYSCTL | ||||||
|  | 	struct ctl_table_header		*smc_hdr; | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -4,4 +4,4 @@ obj-$(CONFIG_SMC)	+= smc.o | ||||||
| obj-$(CONFIG_SMC_DIAG)	+= smc_diag.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 := 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_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_close.h" | ||||||
| #include "smc_stats.h" | #include "smc_stats.h" | ||||||
| #include "smc_tracepoint.h" | #include "smc_tracepoint.h" | ||||||
|  | #include "smc_sysctl.h" | ||||||
| 
 | 
 | ||||||
| static DEFINE_MUTEX(smc_server_lgr_pending);	/* serialize link group
 | static DEFINE_MUTEX(smc_server_lgr_pending);	/* serialize link group
 | ||||||
| 						 * creation on server | 						 * creation on server | ||||||
|  | @ -3273,9 +3274,17 @@ static int __init smc_init(void) | ||||||
| 		goto out_sock; | 		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); | 	static_branch_enable(&tcp_have_smc); | ||||||
| 	return 0; | 	return 0; | ||||||
| 
 | 
 | ||||||
|  | out_ulp: | ||||||
|  | 	tcp_unregister_ulp(&smc_ulp_ops); | ||||||
| out_sock: | out_sock: | ||||||
| 	sock_unregister(PF_SMC); | 	sock_unregister(PF_SMC); | ||||||
| out_proto6: | out_proto6: | ||||||
|  | @ -3303,6 +3312,7 @@ static int __init smc_init(void) | ||||||
| static void __exit smc_exit(void) | static void __exit smc_exit(void) | ||||||
| { | { | ||||||
| 	static_branch_disable(&tcp_have_smc); | 	static_branch_disable(&tcp_have_smc); | ||||||
|  | 	smc_sysctl_exit(); | ||||||
| 	tcp_unregister_ulp(&smc_ulp_ops); | 	tcp_unregister_ulp(&smc_ulp_ops); | ||||||
| 	sock_unregister(PF_SMC); | 	sock_unregister(PF_SMC); | ||||||
| 	smc_core_exit(); | 	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