Message ID | 1695568613-125057-4-git-send-email-guwen@linux.alibaba.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net/smc: implement virtual ISM extension and loopback-ism | expand |
On 24/09/2023 17:16, Wen Gu wrote: > 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. > /* 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);
On 2023/9/28 11:08, Jan Karcher wrote: > > > On 24/09/2023 17:16, Wen Gu wrote: >> 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. >> /* 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);
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); /* 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);
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(-)