From: Wenjia Zhang <wenjia@linux.ibm.com>
To: Guangguan Wang <guangguan.wang@linux.alibaba.com>,
jaka@linux.ibm.com, kgraul@linux.ibm.com,
tonylu@linux.alibaba.com, davem@davemloft.net,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com
Cc: horms@kernel.org, alibuda@linux.alibaba.com,
guwen@linux.alibaba.com, linux-s390@vger.kernel.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v2 net-next 1/6] net/smc: support smc release version negotiation in clc handshake
Date: Wed, 9 Aug 2023 18:03:40 +0200 [thread overview]
Message-ID: <ecafff58-c93a-5592-ddaa-d8724cf6bdcc@linux.ibm.com> (raw)
In-Reply-To: <20230807062720.20555-2-guangguan.wang@linux.alibaba.com>
On 07.08.23 08:27, Guangguan Wang wrote:
> Support smc release version negotiation in clc handshake. And set
> the latest smc release version to 2.1.
>
Could you elaborate the changes? Without reading code, it is really
difficult to know what you did, and why you did it. Sure, one can read
the code and the support document, but the commit message should always
be the quick reference. The following information I missed especially:
- This implementation is based on SMCv2 where no negotiation process for
different releases, but for different versions.
- The Server makes the decision for which release will be used.
> Signed-off-by: Guangguan Wang <guangguan.wang@linux.alibaba.com>
> Reviewed-by: Tony Lu <tonylu@linux.alibaba.com>
> ---
> net/smc/af_smc.c | 22 ++++++++++++++++++++--
> net/smc/smc.h | 5 ++++-
> net/smc/smc_clc.c | 14 +++++++-------
> net/smc/smc_clc.h | 23 ++++++++++++++++++++++-
> net/smc/smc_core.h | 1 +
> 5 files changed, 54 insertions(+), 11 deletions(-)
>
> diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
> index a7f887d91d89..bac73eb0542d 100644
> --- a/net/smc/af_smc.c
> +++ b/net/smc/af_smc.c
> @@ -1187,6 +1187,11 @@ static int smc_connect_rdma_v2_prepare(struct smc_sock *smc,
> return SMC_CLC_DECL_NOINDIRECT;
> }
> }
> +
> + if (fce->release > SMC_RELEASE)
> + return SMC_CLC_DECL_VERSMISMAT;
I'm wondering if this check is necessary, how it could happen?
> + ini->release_ver = fce->release;
> +
> return 0;
> }
>
> @@ -1355,6 +1360,15 @@ static int smc_connect_ism(struct smc_sock *smc,
> struct smc_clc_msg_accept_confirm_v2 *aclc_v2 =
> (struct smc_clc_msg_accept_confirm_v2 *)aclc;
>
> + if (ini->first_contact_peer) {
> + struct smc_clc_first_contact_ext *fce =
> + smc_get_clc_first_contact_ext(aclc_v2, true);
> +
> + if (fce->release > SMC_RELEASE)
> + return SMC_CLC_DECL_VERSMISMAT;
> + ini->release_ver = fce->release;
> + }
> +
> rc = smc_v2_determine_accepted_chid(aclc_v2, ini);
> if (rc)
> return rc;
> @@ -1389,7 +1403,7 @@ static int smc_connect_ism(struct smc_sock *smc,
> }
>
> rc = smc_clc_send_confirm(smc, ini->first_contact_local,
> - aclc->hdr.version, eid, NULL);
> + aclc->hdr.version, eid, ini);
> if (rc)
> goto connect_abort;
> mutex_unlock(&smc_server_lgr_pending);
> @@ -1965,6 +1979,10 @@ static int smc_listen_v2_check(struct smc_sock *new_smc,
> }
> }
>
> + ini->release_ver = pclc_v2_ext->hdr.flag.release;
> + if (pclc_v2_ext->hdr.flag.release > SMC_RELEASE)
> + ini->release_ver = SMC_RELEASE;
> +
> out:
> if (!ini->smcd_version && !ini->smcr_version)
> return rc;
> @@ -2412,7 +2430,7 @@ static void smc_listen_work(struct work_struct *work)
> /* send SMC Accept CLC message */
> accept_version = ini->is_smcd ? ini->smcd_version : ini->smcr_version;
> rc = smc_clc_send_accept(new_smc, ini->first_contact_local,
> - accept_version, ini->negotiated_eid);
> + accept_version, ini->negotiated_eid, ini);
> if (rc)
> goto out_unlock;
>
> diff --git a/net/smc/smc.h b/net/smc/smc.h
> index 2eeea4cdc718..9cce1a41e011 100644
> --- a/net/smc/smc.h
> +++ b/net/smc/smc.h
> @@ -21,7 +21,10 @@
>
> #define SMC_V1 1 /* SMC version V1 */
> #define SMC_V2 2 /* SMC version V2 */
> -#define SMC_RELEASE 0
> +
> +#define SMC_RELEASE_0 0
> +#define SMC_RELEASE_1 1
> +#define SMC_RELEASE SMC_RELEASE_1 /* the latest release version */
>
> #define SMCPROTO_SMC 0 /* SMC protocol, IPv4 */
> #define SMCPROTO_SMC6 1 /* SMC protocol, IPv6 */
> diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c
> index b9b8b07aa702..4ae27bf65732 100644
> --- a/net/smc/smc_clc.c
> +++ b/net/smc/smc_clc.c
> @@ -420,11 +420,11 @@ smc_clc_msg_decl_valid(struct smc_clc_msg_decline *dclc)
> return true;
> }
>
> -static void smc_clc_fill_fce(struct smc_clc_first_contact_ext *fce, int *len)
> +static void smc_clc_fill_fce(struct smc_clc_first_contact_ext *fce, int *len, int release_ver)
> {
> memset(fce, 0, sizeof(*fce));
> fce->os_type = SMC_CLC_OS_LINUX;
> - fce->release = SMC_RELEASE;
> + fce->release = release_ver;
> memcpy(fce->hostname, smc_hostname, sizeof(smc_hostname));
> (*len) += sizeof(*fce);
> }
Personally I'd like release_nr instead of release_ver.
> @@ -1019,7 +1019,7 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
> memcpy(clc_v2->d1.eid, eid, SMC_MAX_EID_LEN);
> len = SMCD_CLC_ACCEPT_CONFIRM_LEN_V2;
> if (first_contact)
> - smc_clc_fill_fce(&fce, &len);
> + smc_clc_fill_fce(&fce, &len, ini->release_ver);
> clc_v2->hdr.length = htons(len);
> }
> memcpy(trl.eyecatcher, SMCD_EYECATCHER,
> @@ -1063,10 +1063,10 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
> memcpy(clc_v2->r1.eid, eid, SMC_MAX_EID_LEN);
> len = SMCR_CLC_ACCEPT_CONFIRM_LEN_V2;
> if (first_contact) {
> - smc_clc_fill_fce(&fce, &len);
> + smc_clc_fill_fce(&fce, &len, ini->release_ver);
> fce.v2_direct = !link->lgr->uses_gateway;
> memset(&gle, 0, sizeof(gle));
> - if (ini && clc->hdr.type == SMC_CLC_CONFIRM) {
> + if (clc->hdr.type == SMC_CLC_CONFIRM) {
> gle.gid_cnt = ini->smcrv2.gidlist.len;
> len += sizeof(gle);
> len += gle.gid_cnt * sizeof(gle.gid[0]);
> @@ -1141,7 +1141,7 @@ int smc_clc_send_confirm(struct smc_sock *smc, bool clnt_first_contact,
>
> /* send CLC ACCEPT message across internal TCP socket */
> int smc_clc_send_accept(struct smc_sock *new_smc, bool srv_first_contact,
> - u8 version, u8 *negotiated_eid)
> + u8 version, u8 *negotiated_eid, struct smc_init_info *ini)
> {
> struct smc_clc_msg_accept_confirm_v2 aclc_v2;
> int len;
> @@ -1149,7 +1149,7 @@ int smc_clc_send_accept(struct smc_sock *new_smc, bool srv_first_contact,
> memset(&aclc_v2, 0, sizeof(aclc_v2));
> aclc_v2.hdr.type = SMC_CLC_ACCEPT;
> len = smc_clc_send_confirm_accept(new_smc, &aclc_v2, srv_first_contact,
> - version, negotiated_eid, NULL);
> + version, negotiated_eid, ini);
> if (len < ntohs(aclc_v2.hdr.length))
> len = len >= 0 ? -EPROTO : -new_smc->clcsock->sk->sk_err;
>
> diff --git a/net/smc/smc_clc.h b/net/smc/smc_clc.h
> index 5fee545c9a10..b923e89acafb 100644
> --- a/net/smc/smc_clc.h
> +++ b/net/smc/smc_clc.h
> @@ -370,6 +370,27 @@ smc_get_clc_smcd_v2_ext(struct smc_clc_v2_extension *prop_v2ext)
> ntohs(prop_v2ext->hdr.smcd_v2_ext_offset));
> }
>
> +static inline struct smc_clc_first_contact_ext *
> +smc_get_clc_first_contact_ext(struct smc_clc_msg_accept_confirm_v2 *clc_v2,
> + bool is_smcd)
> +{
> + int clc_v2_len;
> +
> + if (clc_v2->hdr.version == SMC_V1 ||
> + !(clc_v2->hdr.typev2 & SMC_FIRST_CONTACT_MASK))
> + return NULL;
> +
> + if (is_smcd)
> + clc_v2_len =
> + offsetofend(struct smc_clc_msg_accept_confirm_v2, d1);
> + else
> + clc_v2_len =
> + offsetofend(struct smc_clc_msg_accept_confirm_v2, r1);
> +
> + return (struct smc_clc_first_contact_ext *)(((u8 *)clc_v2) +
> + clc_v2_len);
> +}
> +
> struct smcd_dev;
> struct smc_init_info;
>
> @@ -382,7 +403,7 @@ int smc_clc_send_proposal(struct smc_sock *smc, struct smc_init_info *ini);
> int smc_clc_send_confirm(struct smc_sock *smc, bool clnt_first_contact,
> u8 version, u8 *eid, struct smc_init_info *ini);
> int smc_clc_send_accept(struct smc_sock *smc, bool srv_first_contact,
> - u8 version, u8 *negotiated_eid);
> + u8 version, u8 *negotiated_eid, struct smc_init_info *ini);
> void smc_clc_init(void) __init;
> void smc_clc_exit(void);
> void smc_clc_get_hostname(u8 **host);
> diff --git a/net/smc/smc_core.h b/net/smc/smc_core.h
> index 3c1b31bfa1cf..1a97fef39127 100644
> --- a/net/smc/smc_core.h
> +++ b/net/smc/smc_core.h
> @@ -374,6 +374,7 @@ struct smc_init_info {
> u8 is_smcd;
> u8 smc_type_v1;
> u8 smc_type_v2;
> + u8 release_ver;
Also here, I'd like release_nr more.
> u8 first_contact_peer;
> u8 first_contact_local;
> unsigned short vlan_id;
next prev parent reply other threads:[~2023-08-09 16:03 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-07 6:27 [RFC PATCH v2 net-next 0/6] net/smc: several features's implementation for smc v2.1 Guangguan Wang
2023-08-07 6:27 ` [RFC PATCH v2 net-next 1/6] net/smc: support smc release version negotiation in clc handshake Guangguan Wang
2023-08-09 16:03 ` Wenjia Zhang [this message]
2023-08-15 3:57 ` Guangguan Wang
2023-08-07 6:27 ` [RFC PATCH v2 net-next 2/6] net/smc: add vendor unique experimental options area " Guangguan Wang
2023-08-07 6:27 ` [RFC PATCH v2 net-next 3/6] net/smc: support smc v2.x features validate Guangguan Wang
2023-08-09 16:03 ` Wenjia Zhang
2023-08-15 3:59 ` Guangguan Wang
2023-08-07 6:27 ` [RFC PATCH v2 net-next 4/6] net/smc: support max connections per lgr negotiation Guangguan Wang
2023-08-09 16:04 ` Wenjia Zhang
2023-08-15 6:31 ` Guangguan Wang
2023-08-28 12:54 ` Wenjia Zhang
2023-08-29 2:31 ` Guangguan Wang
2023-08-29 13:18 ` Wenjia Zhang
2023-08-30 3:17 ` Guangguan Wang
2023-08-30 15:22 ` Wenjia Zhang
2023-08-07 6:27 ` [RFC PATCH v2 net-next 5/6] net/smc: support max links per lgr negotiation in clc handshake Guangguan Wang
2023-08-07 15:08 ` Simon Horman
2023-08-07 6:27 ` [RFC PATCH v2 net-next 6/6] net/smc: Extend SMCR v2 linkgroup netlink attribute Guangguan Wang
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=ecafff58-c93a-5592-ddaa-d8724cf6bdcc@linux.ibm.com \
--to=wenjia@linux.ibm.com \
--cc=alibuda@linux.alibaba.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=guangguan.wang@linux.alibaba.com \
--cc=guwen@linux.alibaba.com \
--cc=horms@kernel.org \
--cc=jaka@linux.ibm.com \
--cc=kgraul@linux.ibm.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=tonylu@linux.alibaba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).