| From 4940a1fdf31c39f0806ac831cde333134862030b Mon Sep 17 00:00:00 2001 |
| From: "D. Wythe" <alibuda@linux.alibaba.com> |
| Date: Wed, 2 Mar 2022 21:25:12 +0800 |
| Subject: net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB error cause by server |
| |
| From: D. Wythe <alibuda@linux.alibaba.com> |
| |
| commit 4940a1fdf31c39f0806ac831cde333134862030b upstream. |
| |
| The problem of SMC_CLC_DECL_ERR_REGRMB on the server is very clear. |
| Based on the fact that whether a new SMC connection can be accepted or |
| not depends on not only the limit of conn nums, but also the available |
| entries of rtoken. Since the rtoken release is trigger by peer, while |
| the conn nums is decrease by local, tons of thing can happen in this |
| time difference. |
| |
| This only thing that needs to be mentioned is that now all connection |
| creations are completely protected by smc_server_lgr_pending lock, it's |
| enough to check only the available entries in rtokens_used_mask. |
| |
| Fixes: cd6851f30386 ("smc: remote memory buffers (RMBs)") |
| Signed-off-by: D. Wythe <alibuda@linux.alibaba.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/smc/smc_core.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/net/smc/smc_core.c |
| +++ b/net/smc/smc_core.c |
| @@ -632,7 +632,8 @@ int smc_conn_create(struct smc_sock *smc |
| !lgr->sync_err && |
| lgr->vlan_id == ini->vlan_id && |
| (role == SMC_CLNT || |
| - lgr->conns_num < SMC_RMBS_PER_LGR_MAX)) { |
| + (lgr->conns_num < SMC_RMBS_PER_LGR_MAX && |
| + !bitmap_full(lgr->rtokens_used_mask, SMC_RMBS_PER_LGR_MAX)))) { |
| /* link group found */ |
| ini->cln_first_contact = SMC_REUSE_CONTACT; |
| conn->lgr = lgr; |