Message ID | 2d3f81193fc7a245c50b30329d0e84ae98427a33.1643380219.git.alibuda@linux.alibaba.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | net/smc: Optimizing performance in | expand |
On Fri, Jan 28, 2022 at 10:44:38PM +0800, D. Wythe wrote: > From: "D. Wythe" <alibuda@linux.alibaba.com> > @@ -19,3 +19,15 @@ config SMC_DIAG ... > +if SMC > + > +config SMC_AUTO_FALLBACK > + bool "SMC: automatic fallback to TCP" > + default y > + help > + Allow automatic fallback to TCP accroding to the pressure of SMC-R > + handshake process. > + > + If that's not what you except or unsure, say N. > +endif Using a netlink knob to control behavior with static key should be more flexible. As I appended in the previous version of this patch. Thank you, Tony Lu
Copy that. I'll try it in next version. Thanks. 在 2022/1/29 下午12:33, Tony Lu 写道: > Using a netlink knob to control behavior with static key should be more > flexible. As I appended in the previous version of this patch. > > Thank you, > Tony Lu
After some trial and thought, I found that the scope of netlink control is too large, we should limit the scope to socket. Adding a socket option may be a better choice, what do you think? 在 2022/1/29 下午12:33, Tony Lu 写道: > On Fri, Jan 28, 2022 at 10:44:38PM +0800, D. Wythe wrote: >> From: "D. Wythe" <alibuda@linux.alibaba.com> >> @@ -19,3 +19,15 @@ config SMC_DIAG > > ... > >> +if SMC >> + >> +config SMC_AUTO_FALLBACK >> + bool "SMC: automatic fallback to TCP" >> + default y >> + help >> + Allow automatic fallback to TCP accroding to the pressure of SMC-R >> + handshake process. >> + >> + If that's not what you except or unsure, say N. >> +endif > > Using a netlink knob to control behavior with static key should be more > flexible. As I appended in the previous version of this patch. > > Thank you, > Tony Lu
On Mon, Feb 07, 2022 at 03:13:22PM +0800, D. Wythe wrote: > > After some trial and thought, I found that the scope of netlink control is > too large, we should limit the scope to socket. Adding a socket option may > be a better choice, what do you think? > It is a good idea to be a socket-level config. Maybe we could consider netlink as default global behaviour. Thanks, Tony Lu
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 78b91bb..1c4ae5d 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -394,6 +394,7 @@ struct tcp_sock { bool is_mptcp; #endif #if IS_ENABLED(CONFIG_SMC) + bool (*smc_in_limited)(const struct sock *sk); bool syn_smc; /* SYN includes SMC */ #endif diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index dc49a3d..9890de9 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -6701,7 +6701,8 @@ static void tcp_openreq_init(struct request_sock *req, ireq->ir_num = ntohs(tcp_hdr(skb)->dest); ireq->ir_mark = inet_request_mark(sk, skb); #if IS_ENABLED(CONFIG_SMC) - ireq->smc_ok = rx_opt->smc_ok; + ireq->smc_ok = rx_opt->smc_ok && !(tcp_sk(sk)->smc_in_limited && + tcp_sk(sk)->smc_in_limited(sk)); #endif } diff --git a/net/smc/Kconfig b/net/smc/Kconfig index 1ab3c5a..a4e1713 100644 --- a/net/smc/Kconfig +++ b/net/smc/Kconfig @@ -19,3 +19,15 @@ config SMC_DIAG smcss. if unsure, say Y. + +if SMC + +config SMC_AUTO_FALLBACK + bool "SMC: automatic fallback to TCP" + default y + help + Allow automatic fallback to TCP accroding to the pressure of SMC-R + handshake process. + + If that's not what you except or unsure, say N. +endif diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 66a0e64..49b8a29 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -101,6 +101,24 @@ static struct sock *smc_tcp_syn_recv_sock(const struct sock *sk, struct sk_buff return NULL; } +#if IS_ENABLED(CONFIG_SMC_AUTO_FALLBACK) +static bool smc_is_in_limited(const struct sock *sk) +{ + const struct smc_sock *smc; + + smc = (const struct smc_sock *) + ((uintptr_t)sk->sk_user_data & ~SK_USER_DATA_NOCOPY); + + if (!smc) + return true; + + if (workqueue_congested(WORK_CPU_UNBOUND, smc_hs_wq)) + return true; + + return false; +} +#endif + static struct smc_hashinfo smc_v4_hashinfo = { .lock = __RW_LOCK_UNLOCKED(smc_v4_hashinfo.lock), }; @@ -2206,6 +2224,10 @@ static int smc_listen(struct socket *sock, int backlog) inet_csk(smc->clcsock->sk)->icsk_af_ops = &smc->af_ops; +#if IS_ENABLED(CONFIG_SMC_AUTO_FALLBACK) + tcp_sk(smc->clcsock->sk)->smc_in_limited = smc_is_in_limited; +#endif + rc = kernel_listen(smc->clcsock, backlog); if (rc) { smc->clcsock->sk->sk_data_ready = smc->clcsk_data_ready;