net/smc: introduce sub-functions for smc_clc_send_confirm_accept()
authorWen Gu <guwen@linux.alibaba.com>
Tue, 19 Dec 2023 14:26:08 +0000 (22:26 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 Dec 2023 20:24:32 +0000 (20:24 +0000)
There is a large if-else block in smc_clc_send_confirm_accept() and it
is better to split it into two sub-functions.

Suggested-by: Alexandra Winter <wintera@linux.ibm.com>
Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_clc.c

index 0fcb035b50552527d3c65b9ec8f6372f56ab078a..1a230d855a5fbc9b14a1dd74cc19ef09df251026 100644 (file)
@@ -998,6 +998,112 @@ int smc_clc_send_proposal(struct smc_sock *smc, struct smc_init_info *ini)
        return reason_code;
 }
 
+static void
+smcd_clc_prep_confirm_accept(struct smc_connection *conn,
+                            struct smc_clc_msg_accept_confirm_v2 *clc_v2,
+                            int first_contact, u8 version,
+                            u8 *eid, struct smc_init_info *ini,
+                            int *fce_len,
+                            struct smc_clc_first_contact_ext_v2x *fce_v2x,
+                            struct smc_clc_msg_trail *trl)
+{
+       struct smcd_dev *smcd = conn->lgr->smcd;
+       struct smc_clc_msg_accept_confirm *clc;
+       int len;
+
+       /* SMC-D specific settings */
+       clc = (struct smc_clc_msg_accept_confirm *)clc_v2;
+       memcpy(clc->hdr.eyecatcher, SMCD_EYECATCHER,
+              sizeof(SMCD_EYECATCHER));
+       clc->hdr.typev1 = SMC_TYPE_D;
+       clc->d0.gid = htonll(smcd->ops->get_local_gid(smcd));
+       clc->d0.token = htonll(conn->rmb_desc->token);
+       clc->d0.dmbe_size = conn->rmbe_size_comp;
+       clc->d0.dmbe_idx = 0;
+       memcpy(&clc->d0.linkid, conn->lgr->id, SMC_LGR_ID_SIZE);
+       if (version == SMC_V1) {
+               clc->hdr.length = htons(SMCD_CLC_ACCEPT_CONFIRM_LEN);
+       } else {
+               clc_v2->d1.chid = htons(smc_ism_get_chid(smcd));
+               if (eid && eid[0])
+                       memcpy(clc_v2->d1.eid, eid, SMC_MAX_EID_LEN);
+               len = SMCD_CLC_ACCEPT_CONFIRM_LEN_V2;
+               if (first_contact) {
+                       *fce_len = smc_clc_fill_fce_v2x(fce_v2x, ini);
+                       len += *fce_len;
+               }
+               clc_v2->hdr.length = htons(len);
+       }
+       memcpy(trl->eyecatcher, SMCD_EYECATCHER,
+              sizeof(SMCD_EYECATCHER));
+}
+
+static void
+smcr_clc_prep_confirm_accept(struct smc_connection *conn,
+                            struct smc_clc_msg_accept_confirm_v2 *clc_v2,
+                            int first_contact, u8 version,
+                            u8 *eid, struct smc_init_info *ini,
+                            int *fce_len,
+                            struct smc_clc_first_contact_ext_v2x *fce_v2x,
+                            struct smc_clc_fce_gid_ext *gle,
+                            struct smc_clc_msg_trail *trl)
+{
+       struct smc_clc_msg_accept_confirm *clc;
+       struct smc_link *link = conn->lnk;
+       int len;
+
+       /* SMC-R specific settings */
+       clc = (struct smc_clc_msg_accept_confirm *)clc_v2;
+       memcpy(clc->hdr.eyecatcher, SMC_EYECATCHER,
+              sizeof(SMC_EYECATCHER));
+       clc->hdr.typev1 = SMC_TYPE_R;
+       memcpy(clc->r0.lcl.id_for_peer, local_systemid,
+              sizeof(local_systemid));
+       memcpy(&clc->r0.lcl.gid, link->gid, SMC_GID_SIZE);
+       memcpy(&clc->r0.lcl.mac, &link->smcibdev->mac[link->ibport - 1],
+              ETH_ALEN);
+       hton24(clc->r0.qpn, link->roce_qp->qp_num);
+       clc->r0.rmb_rkey =
+               htonl(conn->rmb_desc->mr[link->link_idx]->rkey);
+       clc->r0.rmbe_idx = 1; /* for now: 1 RMB = 1 RMBE */
+       clc->r0.rmbe_alert_token = htonl(conn->alert_token_local);
+       switch (clc->hdr.type) {
+       case SMC_CLC_ACCEPT:
+               clc->r0.qp_mtu = link->path_mtu;
+               break;
+       case SMC_CLC_CONFIRM:
+               clc->r0.qp_mtu = min(link->path_mtu, link->peer_mtu);
+               break;
+       }
+       clc->r0.rmbe_size = conn->rmbe_size_comp;
+       clc->r0.rmb_dma_addr = conn->rmb_desc->is_vm ?
+               cpu_to_be64((uintptr_t)conn->rmb_desc->cpu_addr) :
+               cpu_to_be64((u64)sg_dma_address
+                           (conn->rmb_desc->sgt[link->link_idx].sgl));
+       hton24(clc->r0.psn, link->psn_initial);
+       if (version == SMC_V1) {
+               clc->hdr.length = htons(SMCR_CLC_ACCEPT_CONFIRM_LEN);
+       } else {
+               if (eid && eid[0])
+                       memcpy(clc_v2->r1.eid, eid, SMC_MAX_EID_LEN);
+               len = SMCR_CLC_ACCEPT_CONFIRM_LEN_V2;
+               if (first_contact) {
+                       *fce_len = smc_clc_fill_fce_v2x(fce_v2x, ini);
+                       len += *fce_len;
+                       fce_v2x->fce_v2_base.v2_direct =
+                               !link->lgr->uses_gateway;
+                       if (clc->hdr.type == SMC_CLC_CONFIRM) {
+                               memset(gle, 0, sizeof(*gle));
+                               gle->gid_cnt = ini->smcrv2.gidlist.len;
+                               len += sizeof(*gle);
+                               len += gle->gid_cnt * sizeof(gle->gid[0]);
+                       }
+               }
+               clc_v2->hdr.length = htons(len);
+       }
+       memcpy(trl->eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER));
+}
+
 /* build and send CLC CONFIRM / ACCEPT message */
 static int smc_clc_send_confirm_accept(struct smc_sock *smc,
                                       struct smc_clc_msg_accept_confirm_v2 *clc_v2,
@@ -1006,11 +1112,10 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
 {
        struct smc_clc_first_contact_ext_v2x fce_v2x;
        struct smc_connection *conn = &smc->conn;
-       struct smcd_dev *smcd = conn->lgr->smcd;
        struct smc_clc_msg_accept_confirm *clc;
        struct smc_clc_fce_gid_ext gle;
        struct smc_clc_msg_trail trl;
-       int i, len, fce_len;
+       int i, fce_len;
        struct kvec vec[5];
        struct msghdr msg;
 
@@ -1019,86 +1124,14 @@ static int smc_clc_send_confirm_accept(struct smc_sock *smc,
        clc->hdr.version = version;     /* SMC version */
        if (first_contact)
                clc->hdr.typev2 |= SMC_FIRST_CONTACT_MASK;
-       if (conn->lgr->is_smcd) {
-               /* SMC-D specific settings */
-               memcpy(clc->hdr.eyecatcher, SMCD_EYECATCHER,
-                      sizeof(SMCD_EYECATCHER));
-               clc->hdr.typev1 = SMC_TYPE_D;
-               clc->d0.gid = htonll(smcd->ops->get_local_gid(smcd));
-               clc->d0.token = htonll(conn->rmb_desc->token);
-               clc->d0.dmbe_size = conn->rmbe_size_comp;
-               clc->d0.dmbe_idx = 0;
-               memcpy(&clc->d0.linkid, conn->lgr->id, SMC_LGR_ID_SIZE);
-               if (version == SMC_V1) {
-                       clc->hdr.length = htons(SMCD_CLC_ACCEPT_CONFIRM_LEN);
-               } else {
-                       clc_v2->d1.chid = htons(smc_ism_get_chid(smcd));
-                       if (eid && eid[0])
-                               memcpy(clc_v2->d1.eid, eid, SMC_MAX_EID_LEN);
-                       len = SMCD_CLC_ACCEPT_CONFIRM_LEN_V2;
-                       if (first_contact) {
-                               fce_len = smc_clc_fill_fce_v2x(&fce_v2x, ini);
-                               len += fce_len;
-                       }
-                       clc_v2->hdr.length = htons(len);
-               }
-               memcpy(trl.eyecatcher, SMCD_EYECATCHER,
-                      sizeof(SMCD_EYECATCHER));
-       } else {
-               struct smc_link *link = conn->lnk;
-
-               /* SMC-R specific settings */
-               memcpy(clc->hdr.eyecatcher, SMC_EYECATCHER,
-                      sizeof(SMC_EYECATCHER));
-               clc->hdr.typev1 = SMC_TYPE_R;
-               clc->hdr.length = htons(SMCR_CLC_ACCEPT_CONFIRM_LEN);
-               memcpy(clc->r0.lcl.id_for_peer, local_systemid,
-                      sizeof(local_systemid));
-               memcpy(&clc->r0.lcl.gid, link->gid, SMC_GID_SIZE);
-               memcpy(&clc->r0.lcl.mac, &link->smcibdev->mac[link->ibport - 1],
-                      ETH_ALEN);
-               hton24(clc->r0.qpn, link->roce_qp->qp_num);
-               clc->r0.rmb_rkey =
-                       htonl(conn->rmb_desc->mr[link->link_idx]->rkey);
-               clc->r0.rmbe_idx = 1; /* for now: 1 RMB = 1 RMBE */
-               clc->r0.rmbe_alert_token = htonl(conn->alert_token_local);
-               switch (clc->hdr.type) {
-               case SMC_CLC_ACCEPT:
-                       clc->r0.qp_mtu = link->path_mtu;
-                       break;
-               case SMC_CLC_CONFIRM:
-                       clc->r0.qp_mtu = min(link->path_mtu, link->peer_mtu);
-                       break;
-               }
-               clc->r0.rmbe_size = conn->rmbe_size_comp;
-               clc->r0.rmb_dma_addr = conn->rmb_desc->is_vm ?
-                       cpu_to_be64((uintptr_t)conn->rmb_desc->cpu_addr) :
-                       cpu_to_be64((u64)sg_dma_address
-                                   (conn->rmb_desc->sgt[link->link_idx].sgl));
-               hton24(clc->r0.psn, link->psn_initial);
-               if (version == SMC_V1) {
-                       clc->hdr.length = htons(SMCR_CLC_ACCEPT_CONFIRM_LEN);
-               } else {
-                       if (eid && eid[0])
-                               memcpy(clc_v2->r1.eid, eid, SMC_MAX_EID_LEN);
-                       len = SMCR_CLC_ACCEPT_CONFIRM_LEN_V2;
-                       if (first_contact) {
-                               fce_len = smc_clc_fill_fce_v2x(&fce_v2x, ini);
-                               len += fce_len;
-                               fce_v2x.fce_v2_base.v2_direct =
-                                       !link->lgr->uses_gateway;
-                               if (clc->hdr.type == SMC_CLC_CONFIRM) {
-                                       memset(&gle, 0, sizeof(gle));
-                                       gle.gid_cnt = ini->smcrv2.gidlist.len;
-                                       len += sizeof(gle);
-                                       len += gle.gid_cnt * sizeof(gle.gid[0]);
-                               }
-                       }
-                       clc_v2->hdr.length = htons(len);
-               }
-               memcpy(trl.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER));
-       }
-
+       if (conn->lgr->is_smcd)
+               smcd_clc_prep_confirm_accept(conn, clc_v2, first_contact,
+                                            version, eid, ini, &fce_len,
+                                            &fce_v2x, &trl);
+       else
+               smcr_clc_prep_confirm_accept(conn, clc_v2, first_contact,
+                                            version, eid, ini, &fce_len,
+                                            &fce_v2x, &gle, &trl);
        memset(&msg, 0, sizeof(msg));
        i = 0;
        vec[i].iov_base = clc_v2;