From: "D.Wythe" <alibuda@linux.alibaba.com>
To: kgraul@linux.ibm.com, wenjia@linux.ibm.com, jaka@linux.ibm.com
Cc: kuba@kernel.org, davem@davemloft.net, netdev@vger.kernel.org,
linux-s390@vger.kernel.org, linux-rdma@vger.kernel.org
Subject: [PATCH net-next v5 03/10] net/smc: fix SMC_CLC_DECL_ERR_REGRMB without smc_server_lgr_pending
Date: Wed, 23 Nov 2022 23:54:43 +0800 [thread overview]
Message-ID: <1669218890-115854-4-git-send-email-alibuda@linux.alibaba.com> (raw)
In-Reply-To: <1669218890-115854-1-git-send-email-alibuda@linux.alibaba.com>
From: "D. Wythe" <alibuda@linux.alibaba.com>
As commit 4940a1fdf31c ("net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB
error cause by server") mentioned, it works only when all connection
creations are completely protected by smc_server_lgr_pending, since we
already remove this lock, we need to re-fix the issues.
Fixes: 4940a1fdf31c ("net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB error cause by server")
Signed-off-by: D. Wythe <alibuda@linux.alibaba.com>
---
net/smc/af_smc.c | 2 ++
net/smc/smc_core.c | 11 ++++++++---
net/smc/smc_core.h | 19 +++++++++++++++++++
3 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 8594927..7911caf 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -2420,6 +2420,7 @@ static void smc_listen_work(struct work_struct *work)
goto out_unlock;
mutex_unlock(&smc_server_lgr_pending);
}
+ smc_conn_leave_rtoken_pending(new_smc, ini);
smc_conn_save_peer_info(new_smc, cclc);
smc_listen_out_connected(new_smc);
SMC_STAT_SERV_SUCC_INC(sock_net(newclcsock->sk), ini);
@@ -2428,6 +2429,7 @@ static void smc_listen_work(struct work_struct *work)
out_unlock:
mutex_unlock(&smc_server_lgr_pending);
out_decl:
+ smc_conn_leave_rtoken_pending(new_smc, ini);
smc_listen_decline(new_smc, rc, ini ? ini->first_contact_local : 0,
proposal_version);
out_free:
diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
index 5982a00..8394086 100644
--- a/net/smc/smc_core.c
+++ b/net/smc/smc_core.c
@@ -1882,14 +1882,19 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini)
lgr->vlan_id == ini->vlan_id) &&
(role == SMC_CLNT || ini->is_smcd ||
(lgr->conns_num < SMC_RMBS_PER_LGR_MAX &&
- !bitmap_full(lgr->rtokens_used_mask, SMC_RMBS_PER_LGR_MAX)))) {
+ (SMC_RMBS_PER_LGR_MAX -
+ bitmap_weight(lgr->rtokens_used_mask, SMC_RMBS_PER_LGR_MAX)
+ > atomic_read(&lgr->rtoken_pendings))))) {
/* link group found */
ini->first_contact_local = 0;
conn->lgr = lgr;
rc = smc_lgr_register_conn(conn, false);
write_unlock_bh(&lgr->conns_lock);
- if (!rc && delayed_work_pending(&lgr->free_work))
- cancel_delayed_work(&lgr->free_work);
+ if (!rc) {
+ smc_conn_enter_rtoken_pending(smc, ini);
+ if (delayed_work_pending(&lgr->free_work))
+ cancel_delayed_work(&lgr->free_work);
+ }
break;
}
write_unlock_bh(&lgr->conns_lock);
diff --git a/net/smc/smc_core.h b/net/smc/smc_core.h
index 285f9bd..678b2f3 100644
--- a/net/smc/smc_core.h
+++ b/net/smc/smc_core.h
@@ -249,6 +249,9 @@ struct smc_link_group {
struct rb_root conns_all; /* connection tree */
rwlock_t conns_lock; /* protects conns_all */
unsigned int conns_num; /* current # of connections */
+ atomic_t rtoken_pendings;/* number of connection that
+ * lgr assigned but no rtoken got yet
+ */
unsigned short vlan_id; /* vlan id of link group */
struct list_head sndbufs[SMC_RMBE_SIZES];/* tx buffers */
@@ -559,6 +562,22 @@ struct smc_link *smc_switch_conns(struct smc_link_group *lgr,
int smcr_nl_get_link(struct sk_buff *skb, struct netlink_callback *cb);
int smcd_nl_get_lgr(struct sk_buff *skb, struct netlink_callback *cb);
+static inline void smc_conn_enter_rtoken_pending(struct smc_sock *smc, struct smc_init_info *ini)
+{
+ struct smc_link_group *lgr = smc->conn.lgr;
+
+ if (lgr && !ini->first_contact_local)
+ atomic_inc(&lgr->rtoken_pendings);
+}
+
+static inline void smc_conn_leave_rtoken_pending(struct smc_sock *smc, struct smc_init_info *ini)
+{
+ struct smc_link_group *lgr = smc->conn.lgr;
+
+ if (lgr && !ini->first_contact_local)
+ atomic_dec(&lgr->rtoken_pendings);
+}
+
static inline struct smc_link_group *smc_get_lgr(struct smc_link *link)
{
return link->lgr;
--
1.8.3.1
next prev parent reply other threads:[~2022-11-23 15:55 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-23 15:54 [PATCH net-next v5 00/10] optimize the parallelism of SMC-R connections D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 01/10] net/smc: fix potential panic dues to unprotected smc_llc_srv_add_link() D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 02/10] net/smc: fix application data exception D.Wythe
2022-11-23 15:54 ` D.Wythe [this message]
2022-11-24 2:44 ` [PATCH net-next v5 03/10] net/smc: fix SMC_CLC_DECL_ERR_REGRMB without smc_server_lgr_pending D. Wythe
2022-11-23 15:54 ` [PATCH net-next v5 04/10] net/smc: remove locks smc_client_lgr_pending and smc_server_lgr_pending D.Wythe
2022-11-23 18:18 ` kernel test robot
2022-11-23 15:54 ` [PATCH net-next v5 05/10] net/smc: allow confirm/delete rkey response deliver multiplex D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 06/10] net/smc: make SMC_LLC_FLOW_RKEY run concurrently D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 07/10] net/smc: llc_conf_mutex refactor, replace it with rw_semaphore D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 08/10] net/smc: use read semaphores to reduce unnecessary blocking in smc_buf_create() & smcr_buf_unuse() D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 09/10] net/smc: reduce unnecessary blocking in smcr_lgr_reg_rmbs() D.Wythe
2022-11-23 15:54 ` [PATCH net-next v5 10/10] net/smc: replace mutex rmbs_lock and sndbufs_lock with rw_semaphore D.Wythe
2022-11-24 5:55 ` [PATCH net-next v5 00/10] optimize the parallelism of SMC-R connections D. Wythe
2022-11-24 8:33 ` Jan Karcher
2022-11-24 8:53 ` D. Wythe
2022-11-24 13:30 ` Jan Karcher
2022-11-24 19:07 ` D. Wythe
2022-11-24 19:53 ` D. Wythe
2022-11-25 6:54 ` Jan Karcher
2022-11-26 9:08 ` D. Wythe
2022-11-28 11:46 ` Jan Karcher
2022-11-24 8:35 ` Jan Karcher
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1669218890-115854-4-git-send-email-alibuda@linux.alibaba.com \
--to=alibuda@linux.alibaba.com \
--cc=davem@davemloft.net \
--cc=jaka@linux.ibm.com \
--cc=kgraul@linux.ibm.com \
--cc=kuba@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=wenjia@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.