
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IC914B CVE: NA -------------------------------- This reverts commit 7dad816cb1f8841fda526c0978c10a94793f1178. Replace it with mainline patch 20c9398d3309 ("net/smc: Resolve the race between SMC-R link access and clear") later. Fixes: 7dad816cb1f8 ("anolis: net/smc: Resolve the race between SMC-R link access and clear") Conflicts: net/smc/smc_core.c [conflicts due to merged mainline ddc992866f13 ("net/smc: Add link counters for IB device ports")] Signed-off-by: Wang Liang <wangliang74@huawei.com> --- net/smc/smc_core.c | 45 +++++++++------------------------------------ net/smc/smc_core.h | 4 ---- 2 files changed, 9 insertions(+), 40 deletions(-) diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c index c212a9bebae1..f94d1f452482 100644 --- a/net/smc/smc_core.c +++ b/net/smc/smc_core.c @@ -155,7 +155,6 @@ static int smcr_lgr_conn_assign_link(struct smc_connection *conn, bool first) if (!conn->lnk) return SMC_CLC_DECL_NOACTLINK; atomic_inc(&conn->lnk->conn_cnt); - smcr_link_hold(conn->lnk); /* link_put in smc_conn_free() */ return 0; } @@ -697,8 +696,6 @@ int smcr_link_init(struct smc_link_group *lgr, struct smc_link *lnk, get_device(&ini->ib_dev->ibdev->dev); atomic_inc(&ini->ib_dev->lnk_cnt); - refcount_set(&lnk->refcnt, 1); /* link refcnt is set to 1 */ - lnk->clearing = 0; lnk->link_id = smcr_next_link_id(lgr); lnk->lgr = lgr; smc_lgr_hold(lgr); /* lgr_put in smcr_link_clear() */ @@ -929,12 +926,8 @@ void smc_switch_link_and_count(struct smc_connection *conn, struct smc_link *to_lnk) { atomic_dec(&conn->lnk->conn_cnt); - /* put old link, hold in smcr_lgr_conn_assign_link() */ - smcr_link_put(conn->lnk); conn->lnk = to_lnk; atomic_inc(&conn->lnk->conn_cnt); - /* hold new link, put in smc_conn_free() */ - smcr_link_hold(conn->lnk); } struct smc_link *smc_switch_conns(struct smc_link_group *lgr, @@ -1081,9 +1074,9 @@ void smc_conn_free(struct smc_connection *conn) /* smc connection wasn't registered to a link group * or has already been freed before. * - * Judge these to ensure that lgr/link refcnt will be - * put only once if connection has been registered to - * a link group successfully. + * Judge these to ensure that lgr refcnt will be put + * only once if connection has been registered to a + * link group successfully. */ return; @@ -1108,8 +1101,6 @@ void smc_conn_free(struct smc_connection *conn) if (!lgr->conns_num) smc_lgr_schedule_free_work(lgr); lgr_put: - if (!lgr->is_smcd) - smcr_link_put(conn->lnk); /* link_hold in smcr_lgr_conn_assign_link() */ smc_lgr_put(lgr); /* lgr_hold in smc_lgr_register_conn() */ } @@ -1167,24 +1158,13 @@ static void smcr_rtoken_clear_link(struct smc_link *lnk) } } -void __smcr_link_clear(struct smc_link *lnk) -{ - smc_wr_free_link_mem(lnk); - smc_ibdev_cnt_dec(lnk); - smc_lgr_put(lnk->lgr); /* lgr_hold in smcr_link_init() */ - memset(lnk, 0, sizeof(struct smc_link)); - lnk->state = SMC_LNK_UNUSED; -} - /* must be called under lgr->llc_conf_mutex lock */ void smcr_link_clear(struct smc_link *lnk, bool log) { struct smc_ib_device *smcibdev; - if (lnk->clearing || !lnk->lgr || - lnk->state == SMC_LNK_UNUSED) + if (!lnk->lgr || lnk->state == SMC_LNK_UNUSED) return; - lnk->clearing = 1; lnk->peer_qpn = 0; smc_llc_link_clear(lnk, log); smcr_buf_unmap_lgr(lnk); @@ -1193,22 +1173,15 @@ void smcr_link_clear(struct smc_link *lnk, bool log) smc_wr_free_link(lnk); smc_ib_destroy_queue_pair(lnk); smc_ib_dealloc_protection_domain(lnk); + smc_wr_free_link_mem(lnk); + smc_ibdev_cnt_dec(lnk); + smc_lgr_put(lnk->lgr); /* lgr_hold in smcr_link_init() */ put_device(&lnk->smcibdev->ibdev->dev); smcibdev = lnk->smcibdev; + memset(lnk, 0, sizeof(struct smc_link)); + lnk->state = SMC_LNK_UNUSED; if (!atomic_dec_return(&smcibdev->lnk_cnt)) wake_up(&smcibdev->lnks_deleted); - smcr_link_put(lnk); /* theoretically last link_put */ -} - -void smcr_link_hold(struct smc_link *lnk) -{ - refcount_inc(&lnk->refcnt); -} - -void smcr_link_put(struct smc_link *lnk) -{ - if (refcount_dec_and_test(&lnk->refcnt)) - __smcr_link_clear(lnk); } static void smcr_buf_free(struct smc_link_group *lgr, bool is_rmb, diff --git a/net/smc/smc_core.h b/net/smc/smc_core.h index 54834a6ed98a..4ce4636f8c05 100644 --- a/net/smc/smc_core.h +++ b/net/smc/smc_core.h @@ -129,8 +129,6 @@ struct smc_link { u8 peer_link_uid[SMC_LGR_ID_SIZE]; /* peer uid */ u8 link_idx; /* index in lgr link array */ u8 link_is_asym; /* is link asymmetric? */ - u8 clearing : 1; /* link is being cleared */ - refcount_t refcnt; /* link reference count */ struct smc_link_group *lgr; /* parent link group */ struct work_struct link_down_wrk; /* wrk to bring link down */ char ibname[IB_DEVICE_NAME_MAX]; /* ib device name */ @@ -470,8 +468,6 @@ void smc_core_exit(void); int smcr_link_init(struct smc_link_group *lgr, struct smc_link *lnk, u8 link_idx, struct smc_init_info *ini); void smcr_link_clear(struct smc_link *lnk, bool log); -void smcr_link_hold(struct smc_link *lnk); -void smcr_link_put(struct smc_link *lnk); void smc_switch_link_and_count(struct smc_connection *conn, struct smc_link *to_lnk); int smcr_buf_map_lgr(struct smc_link *lnk); -- 2.34.1