Re: [PATCH net-next v4 03/18] net/smc: extract v2 check helper from SMC-D device registration
From: Wen Gu <guwen@linux.alibaba.com>
Date: 2023-09-30 08:41:57
Also in:
linux-s390, lkml
On 2023/9/28 11:08, Jan Karcher wrote:
On 24/09/2023 17:16, Wen Gu wrote:quoted
This patch extracts v2-capable logic from the process of registering the ISM device as an SMC-D device, so that the registration process of other underlying devices can reuse it. Signed-off-by: Wen Gu <guwen@linux.alibaba.com> --- net/smc/smc_ism.c | 29 ++++++++++++++++++----------- net/smc/smc_ism.h | 1 + 2 files changed, 19 insertions(+), 11 deletions(-)diff --git a/net/smc/smc_ism.c b/net/smc/smc_ism.c index 455ae0a..8f1ba74 100644 --- a/net/smc/smc_ism.c +++ b/net/smc/smc_ism.c@@ -69,6 +69,22 @@ bool smc_ism_is_v2_capable(void)return smc_ism_v2_capable; } +/* must be called under smcd_dev_list.mutex lock */ +void smc_ism_check_v2_capable(struct smcd_dev *smcd) +{ + u8 *system_eid = NULL; + + if (smc_ism_v2_capable) + return; + + system_eid = smcd->ops->get_system_eid(); + if (smcd->ops->supports_v2()) { + smc_ism_v2_capable = true; + memcpy(smc_ism_v2_system_eid, system_eid, + SMC_MAX_EID_LEN); + } +} + /* Set a connection using this DMBE. */ void smc_ism_set_conn(struct smc_connection *conn) {@@ -423,16 +439,7 @@ static void smcd_register_dev(struct ism_dev *ism)smc_pnetid_by_table_smcd(smcd); mutex_lock(&smcd_dev_list.mutex); - if (list_empty(&smcd_dev_list.list)) { - u8 *system_eid = NULL; - - system_eid = smcd->ops->get_system_eid(); - if (smcd->ops->supports_v2()) { - smc_ism_v2_capable = true; - memcpy(smc_ism_v2_system_eid, system_eid, - SMC_MAX_EID_LEN); - } - } + smc_ism_check_v2_capable(smcd);The list_empty check is omitted here which means the smc_ism_check_v2_capable does not touch the list. So i think the call could be placed prior the mutex_lock.
Good catch. I omitted the list_empty check in this version but forget to remove 'the lock comments' and place the helper prior to the mutex_lock. It will be fixed. Thank you.
quoted
/* sort list: devices without pnetid before devices with pnetid */ if (smcd->pnetid[0]) list_add_tail(&smcd->list, &smcd_dev_list.list);@@ -535,10 +542,10 @@ int smc_ism_init(void){ int rc = 0; -#if IS_ENABLED(CONFIG_ISM) smc_ism_v2_capable = false; memset(smc_ism_v2_system_eid, 0, SMC_MAX_EID_LEN); +#if IS_ENABLED(CONFIG_ISM) rc = ism_register_client(&smc_ism_client); #endif return rc;diff --git a/net/smc/smc_ism.h b/net/smc/smc_ism.h index 832b2f4..14d2e77 100644 --- a/net/smc/smc_ism.h +++ b/net/smc/smc_ism.h@@ -42,6 +42,7 @@ int smc_ism_register_dmb(struct smc_link_group *lgr, int buf_size,void smc_ism_get_system_eid(u8 **eid); u16 smc_ism_get_chid(struct smcd_dev *dev); bool smc_ism_is_v2_capable(void); +void smc_ism_check_v2_capable(struct smcd_dev *dev); int smc_ism_init(void); void smc_ism_exit(void); int smcd_nl_get_device(struct sk_buff *skb, struct netlink_callback *cb);