Message ID | 9b52fc3f11a2ae6f23224a178fd4cff9f9dd4eaa.1643284658.git.alibuda@linux.alibaba.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Optimizing performance in short-lived | expand |
Hi Wythe", Thank you for the patch! Perhaps something to improve: [auto build test WARNING on net-next/master] url: https://github.com/0day-ci/linux/commits/D-Wythe/Optimizing-performance-in-short-lived/20220127-200912 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git fbb8295248e1d6f576d444309fcf79356008eac1 config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20220127/202201272349.KA4IX9hr-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 11.2.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/718aff24f3fcc73ecb7bff17fcbe029b799c6624 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review D-Wythe/Optimizing-performance-in-short-lived/20220127-200912 git checkout 718aff24f3fcc73ecb7bff17fcbe029b799c6624 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arc SHELL=/bin/bash net/smc/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): net/smc/af_smc.c: In function 'smc_listen': >> net/smc/af_smc.c:2202:25: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] 2202 | smc->ori_af_ops = inet_csk(smc->clcsock->sk)->icsk_af_ops; | ^ vim +/const +2202 net/smc/af_smc.c 2166 2167 static int smc_listen(struct socket *sock, int backlog) 2168 { 2169 struct sock *sk = sock->sk; 2170 struct smc_sock *smc; 2171 int rc; 2172 2173 smc = smc_sk(sk); 2174 lock_sock(sk); 2175 2176 rc = -EINVAL; 2177 if ((sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) || 2178 smc->connect_nonblock) 2179 goto out; 2180 2181 rc = 0; 2182 if (sk->sk_state == SMC_LISTEN) { 2183 sk->sk_max_ack_backlog = backlog; 2184 goto out; 2185 } 2186 /* some socket options are handled in core, so we could not apply 2187 * them to the clc socket -- copy smc socket options to clc socket 2188 */ 2189 smc_copy_sock_settings_to_clc(smc); 2190 if (!smc->use_fallback) 2191 tcp_sk(smc->clcsock->sk)->syn_smc = 1; 2192 2193 /* save original sk_data_ready function and establish 2194 * smc-specific sk_data_ready function 2195 */ 2196 smc->clcsk_data_ready = smc->clcsock->sk->sk_data_ready; 2197 smc->clcsock->sk->sk_data_ready = smc_clcsock_data_ready; 2198 smc->clcsock->sk->sk_user_data = 2199 (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY); 2200 2201 /* save origin ops */ > 2202 smc->ori_af_ops = inet_csk(smc->clcsock->sk)->icsk_af_ops; 2203 2204 smc->af_ops = *smc->ori_af_ops; 2205 smc->af_ops.syn_recv_sock = smc_tcp_syn_recv_sock; 2206 2207 inet_csk(smc->clcsock->sk)->icsk_af_ops = &smc->af_ops; 2208 2209 rc = kernel_listen(smc->clcsock, backlog); 2210 if (rc) { 2211 smc->clcsock->sk->sk_data_ready = smc->clcsk_data_ready; 2212 goto out; 2213 } 2214 sk->sk_max_ack_backlog = backlog; 2215 sk->sk_ack_backlog = 0; 2216 sk->sk_state = SMC_LISTEN; 2217 2218 out: 2219 release_sock(sk); 2220 return rc; 2221 } 2222 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Wythe", Thank you for the patch! Yet something to improve: [auto build test ERROR on net-next/master] url: https://github.com/0day-ci/linux/commits/D-Wythe/Optimizing-performance-in-short-lived/20220127-200912 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git fbb8295248e1d6f576d444309fcf79356008eac1 config: mips-buildonly-randconfig-r004-20220124 (https://download.01.org/0day-ci/archive/20220127/202201272328.JtsPKLkq-lkp@intel.com/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project f32dccb9a43b02ce4e540d6ba5dbbdb188f2dc7d) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install mips cross compiling tool for clang build # apt-get install binutils-mips-linux-gnu # https://github.com/0day-ci/linux/commit/718aff24f3fcc73ecb7bff17fcbe029b799c6624 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review D-Wythe/Optimizing-performance-in-short-lived/20220127-200912 git checkout 718aff24f3fcc73ecb7bff17fcbe029b799c6624 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=mips SHELL=/bin/bash arch/mips/kernel/ net/smc/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): >> net/smc/af_smc.c:2202:18: error: assigning to 'struct inet_connection_sock_af_ops *' from 'const struct inet_connection_sock_af_ops *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers] smc->ori_af_ops = inet_csk(smc->clcsock->sk)->icsk_af_ops; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. vim +2202 net/smc/af_smc.c 2166 2167 static int smc_listen(struct socket *sock, int backlog) 2168 { 2169 struct sock *sk = sock->sk; 2170 struct smc_sock *smc; 2171 int rc; 2172 2173 smc = smc_sk(sk); 2174 lock_sock(sk); 2175 2176 rc = -EINVAL; 2177 if ((sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) || 2178 smc->connect_nonblock) 2179 goto out; 2180 2181 rc = 0; 2182 if (sk->sk_state == SMC_LISTEN) { 2183 sk->sk_max_ack_backlog = backlog; 2184 goto out; 2185 } 2186 /* some socket options are handled in core, so we could not apply 2187 * them to the clc socket -- copy smc socket options to clc socket 2188 */ 2189 smc_copy_sock_settings_to_clc(smc); 2190 if (!smc->use_fallback) 2191 tcp_sk(smc->clcsock->sk)->syn_smc = 1; 2192 2193 /* save original sk_data_ready function and establish 2194 * smc-specific sk_data_ready function 2195 */ 2196 smc->clcsk_data_ready = smc->clcsock->sk->sk_data_ready; 2197 smc->clcsock->sk->sk_data_ready = smc_clcsock_data_ready; 2198 smc->clcsock->sk->sk_user_data = 2199 (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY); 2200 2201 /* save origin ops */ > 2202 smc->ori_af_ops = inet_csk(smc->clcsock->sk)->icsk_af_ops; 2203 2204 smc->af_ops = *smc->ori_af_ops; 2205 smc->af_ops.syn_recv_sock = smc_tcp_syn_recv_sock; 2206 2207 inet_csk(smc->clcsock->sk)->icsk_af_ops = &smc->af_ops; 2208 2209 rc = kernel_listen(smc->clcsock, backlog); 2210 if (rc) { 2211 smc->clcsock->sk->sk_data_ready = smc->clcsk_data_ready; 2212 goto out; 2213 } 2214 sk->sk_max_ack_backlog = backlog; 2215 sk->sk_ack_backlog = 0; 2216 sk->sk_state = SMC_LISTEN; 2217 2218 out: 2219 release_sock(sk); 2220 return rc; 2221 } 2222 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Wythe", Thank you for the patch! Perhaps something to improve: [auto build test WARNING on net-next/master] url: https://github.com/0day-ci/linux/commits/D-Wythe/Optimizing-performance-in-short-lived/20220127-200912 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git fbb8295248e1d6f576d444309fcf79356008eac1 config: x86_64-randconfig-s022-20220124 (https://download.01.org/0day-ci/archive/20220128/202201280741.2EsIf9Jy-lkp@intel.com/config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-dirty # https://github.com/0day-ci/linux/commit/718aff24f3fcc73ecb7bff17fcbe029b799c6624 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review D-Wythe/Optimizing-performance-in-short-lived/20220127-200912 git checkout 718aff24f3fcc73ecb7bff17fcbe029b799c6624 # save the config file to linux build tree mkdir build_dir make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=x86_64 SHELL=/bin/bash net/smc/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) >> net/smc/af_smc.c:2202:25: sparse: sparse: incorrect type in assignment (different modifiers) @@ expected struct inet_connection_sock_af_ops *ori_af_ops @@ got struct inet_connection_sock_af_ops const *icsk_af_ops @@ net/smc/af_smc.c:2202:25: sparse: expected struct inet_connection_sock_af_ops *ori_af_ops net/smc/af_smc.c:2202:25: sparse: got struct inet_connection_sock_af_ops const *icsk_af_ops vim +2202 net/smc/af_smc.c 2166 2167 static int smc_listen(struct socket *sock, int backlog) 2168 { 2169 struct sock *sk = sock->sk; 2170 struct smc_sock *smc; 2171 int rc; 2172 2173 smc = smc_sk(sk); 2174 lock_sock(sk); 2175 2176 rc = -EINVAL; 2177 if ((sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) || 2178 smc->connect_nonblock) 2179 goto out; 2180 2181 rc = 0; 2182 if (sk->sk_state == SMC_LISTEN) { 2183 sk->sk_max_ack_backlog = backlog; 2184 goto out; 2185 } 2186 /* some socket options are handled in core, so we could not apply 2187 * them to the clc socket -- copy smc socket options to clc socket 2188 */ 2189 smc_copy_sock_settings_to_clc(smc); 2190 if (!smc->use_fallback) 2191 tcp_sk(smc->clcsock->sk)->syn_smc = 1; 2192 2193 /* save original sk_data_ready function and establish 2194 * smc-specific sk_data_ready function 2195 */ 2196 smc->clcsk_data_ready = smc->clcsock->sk->sk_data_ready; 2197 smc->clcsock->sk->sk_data_ready = smc_clcsock_data_ready; 2198 smc->clcsock->sk->sk_user_data = 2199 (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY); 2200 2201 /* save origin ops */ > 2202 smc->ori_af_ops = inet_csk(smc->clcsock->sk)->icsk_af_ops; 2203 2204 smc->af_ops = *smc->ori_af_ops; 2205 smc->af_ops.syn_recv_sock = smc_tcp_syn_recv_sock; 2206 2207 inet_csk(smc->clcsock->sk)->icsk_af_ops = &smc->af_ops; 2208 2209 rc = kernel_listen(smc->clcsock, backlog); 2210 if (rc) { 2211 smc->clcsock->sk->sk_data_ready = smc->clcsk_data_ready; 2212 goto out; 2213 } 2214 sk->sk_max_ack_backlog = backlog; 2215 sk->sk_ack_backlog = 0; 2216 sk->sk_state = SMC_LISTEN; 2217 2218 out: 2219 release_sock(sk); 2220 return rc; 2221 } 2222 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 1b40304..66a0e64 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -73,6 +73,34 @@ static void smc_set_keepalive(struct sock *sk, int val) smc->clcsock->sk->sk_prot->keepalive(smc->clcsock->sk, val); } +static struct sock *smc_tcp_syn_recv_sock(const struct sock *sk, struct sk_buff *skb, + struct request_sock *req, + struct dst_entry *dst, + struct request_sock *req_unhash, + bool *own_req) +{ + struct smc_sock *smc; + + smc = (struct smc_sock *)((uintptr_t)sk->sk_user_data & ~SK_USER_DATA_NOCOPY); + + if (READ_ONCE(sk->sk_ack_backlog) + atomic_read(&smc->smc_pendings) > + sk->sk_max_ack_backlog) + goto drop; + + if (sk_acceptq_is_full(&smc->sk)) { + NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS); + goto drop; + } + + /* passthrough to origin syn recv sock fct */ + return smc->ori_af_ops->syn_recv_sock(sk, skb, req, dst, req_unhash, own_req); + +drop: + dst_release(dst); + tcp_listendrop(sk); + return NULL; +} + static struct smc_hashinfo smc_v4_hashinfo = { .lock = __RW_LOCK_UNLOCKED(smc_v4_hashinfo.lock), }; @@ -1491,6 +1519,9 @@ static void smc_listen_out(struct smc_sock *new_smc) struct smc_sock *lsmc = new_smc->listen_smc; struct sock *newsmcsk = &new_smc->sk; + if (tcp_sk(new_smc->clcsock->sk)->syn_smc) + atomic_dec(&lsmc->smc_pendings); + if (lsmc->sk.sk_state == SMC_LISTEN) { lock_sock_nested(&lsmc->sk, SINGLE_DEPTH_NESTING); smc_accept_enqueue(&lsmc->sk, newsmcsk); @@ -2096,6 +2127,9 @@ static void smc_tcp_listen_work(struct work_struct *work) if (!new_smc) continue; + if (tcp_sk(new_smc->clcsock->sk)->syn_smc) + atomic_inc(&lsmc->smc_pendings); + new_smc->listen_smc = lsmc; new_smc->use_fallback = lsmc->use_fallback; new_smc->fallback_rsn = lsmc->fallback_rsn; @@ -2163,6 +2197,15 @@ static int smc_listen(struct socket *sock, int backlog) smc->clcsock->sk->sk_data_ready = smc_clcsock_data_ready; smc->clcsock->sk->sk_user_data = (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY); + + /* save origin ops */ + smc->ori_af_ops = inet_csk(smc->clcsock->sk)->icsk_af_ops; + + smc->af_ops = *smc->ori_af_ops; + smc->af_ops.syn_recv_sock = smc_tcp_syn_recv_sock; + + inet_csk(smc->clcsock->sk)->icsk_af_ops = &smc->af_ops; + rc = kernel_listen(smc->clcsock, backlog); if (rc) { smc->clcsock->sk->sk_data_ready = smc->clcsk_data_ready; diff --git a/net/smc/smc.h b/net/smc/smc.h index bd2f3dc..4366f24 100644 --- a/net/smc/smc.h +++ b/net/smc/smc.h @@ -240,6 +240,10 @@ struct smc_sock { /* smc sock container */ bool use_fallback; /* fallback to tcp */ int fallback_rsn; /* reason for fallback */ u32 peer_diagnosis; /* decline reason from peer */ + atomic_t smc_pendings; /* pending smc connections */ + struct inet_connection_sock_af_ops af_ops; + struct inet_connection_sock_af_ops *ori_af_ops; + /* origin af ops */ int sockopt_defer_accept; /* sockopt TCP_DEFER_ACCEPT * value