Commit 837f1d71 authored by Litao Jiao's avatar Litao Jiao
Browse files

anolis: net/smc: Introduce sysctl tcp2smc

anolis inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I76JHC
CVE: NA

Reference: https://gitee.com/anolis/cloud-kernel/commit/834a999fa7461d43ce2bf183ab9de7a5245baf2e



--------------------------------

ANBZ: #5550

This patch adds sysctl 'tcp2smc' to provide a switch for replacing
TCP to SMC-R when new sockets are created in a specific net namespace.

Signed-off-by: default avatarWen Gu <guwen@linux.alibaba.com>
Reviewed-by: default avatarXuan Zhuo <xuanzhuo@linux.alibaba.com>
Acked-by: default avatarDust Li <dust.li@linux.alibaba.com>
Reviewed-by: default avatarTony Lu <tonylu@linux.alibaba.com>
Link: https://gitee.com/anolis/cloud-kernel/pulls/1754


Signed-off-by: default avatarLitao Jiao <jiaolitao@sangfor.com.cn>
parent 730ec86f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,5 +9,6 @@ struct netns_smc {
	unsigned int			sysctl_smcr_buf_type;
	int				sysctl_wmem;
	int				sysctl_rmem;
	int				sysctl_tcp2smc;
};
#endif
+8 −0
Original line number Diff line number Diff line
@@ -44,6 +44,12 @@ static struct ctl_table smc_table[] = {
		.proc_handler	= proc_dointvec_minmax,
		.extra1		= &min_rcvbuf,
	},
	{
		.procname	= "tcp2smc",
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_dointvec,
	},
	{  }
};

@@ -84,6 +90,8 @@ int __net_init smc_sysctl_net_init(struct net *net)
	table[idx++].data = &net->smc->sysctl_wmem;
	WRITE_ONCE(net->smc->sysctl_rmem, READ_ONCE(net->ipv4.sysctl_tcp_rmem[1]));
	table[idx++].data = &net->smc->sysctl_rmem;
	net->smc->sysctl_tcp2smc = 0;
	table[idx++].data = &net->smc->sysctl_tcp2smc;

	net->smc->smc_hdr = register_net_sysctl(net, "net/smc", table);
	if (!net->smc->smc_hdr)
+9 −0
Original line number Diff line number Diff line
@@ -1369,6 +1369,15 @@ int __sock_create(struct net *net, int family, int type, int protocol,
			     current->comm);
		family = PF_PACKET;
	}
#if IS_ENABLED(CONFIG_SMC)
	if (!kern && net->smc && net->smc->sysctl_tcp2smc &&
	    (family == AF_INET || family == AF_INET6) &&
	    type == SOCK_STREAM && (protocol == IPPROTO_IP ||
	    protocol == IPPROTO_TCP)) {
		protocol = (family == AF_INET) ? SMCPROTO_SMC : SMCPROTO_SMC6;
		family = AF_SMC;
	}
#endif

	err = security_socket_create(family, type, protocol, kern);
	if (err)