net/smc: adapt SMC server code to use the LLC flow
authorKarsten Graul <kgraul@linux.ibm.com>
Thu, 30 Apr 2020 13:55:42 +0000 (15:55 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Apr 2020 19:44:33 +0000 (12:44 -0700)
Change the code that processes the SMC server part of connection
establishment to use the LLC flow framework (CONFIRM_LINK response
messages).

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Reviewed-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/af_smc.c
net/smc/smc_core.h
net/smc/smc_llc.c

index e859e3f420d956b092d6d88ef2851babdcd55136..ab3aef1ddfa4922377a00d2fdeff484420366875 100644 (file)
@@ -1019,9 +1019,11 @@ void smc_close_non_accepted(struct sock *sk)
 static int smcr_serv_conf_first_link(struct smc_sock *smc)
 {
        struct smc_link *link = smc->conn.lnk;
-       int rest;
+       struct smc_llc_qentry *qentry;
        int rc;
 
+       link->lgr->type = SMC_LGR_SINGLE;
+
        if (smcr_link_reg_rmb(link, smc->conn.rmb_desc, false))
                return SMC_CLC_DECL_ERR_REGRMB;
 
@@ -1031,40 +1033,27 @@ static int smcr_serv_conf_first_link(struct smc_sock *smc)
                return SMC_CLC_DECL_TIMEOUT_CL;
 
        /* receive CONFIRM LINK response from client over the RoCE fabric */
-       rest = wait_for_completion_interruptible_timeout(
-               &link->llc_confirm_resp,
-               SMC_LLC_WAIT_FIRST_TIME);
-       if (rest <= 0) {
+       qentry = smc_llc_wait(link->lgr, link, SMC_LLC_WAIT_TIME,
+                             SMC_LLC_CONFIRM_LINK);
+       if (!qentry) {
                struct smc_clc_msg_decline dclc;
 
                rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
                                      SMC_CLC_DECLINE, CLC_WAIT_TIME_SHORT);
                return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
        }
-
-       if (link->llc_confirm_resp_rc)
+       rc = smc_llc_eval_conf_link(qentry, SMC_LLC_RESP);
+       smc_llc_flow_qentry_del(&link->lgr->llc_flow_lcl);
+       if (rc)
                return SMC_CLC_DECL_RMBE_EC;
 
-       /* send ADD LINK request to client over the RoCE fabric */
-       rc = smc_llc_send_add_link(link,
-                                  link->smcibdev->mac[link->ibport - 1],
-                                  link->gid, SMC_LLC_REQ);
-       if (rc < 0)
-               return SMC_CLC_DECL_TIMEOUT_AL;
-
-       /* receive ADD LINK response from client over the RoCE fabric */
-       rest = wait_for_completion_interruptible_timeout(&link->llc_add_resp,
-                                                        SMC_LLC_WAIT_TIME);
-       if (rest <= 0) {
-               struct smc_clc_msg_decline dclc;
-
-               rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
-                                     SMC_CLC_DECLINE, CLC_WAIT_TIME_SHORT);
-               return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_AL : rc;
-       }
+       /* confirm_rkey is implicit on 1st contact */
+       smc->conn.rmb_desc->is_conf_rkey = true;
 
        smc_llc_link_active(link);
 
+       /* initial contact - try to establish second link */
+       /* tbd: call smc_llc_srv_add_link(link); */
        return 0;
 }
 
@@ -1240,7 +1229,9 @@ static int smc_listen_rdma_finish(struct smc_sock *new_smc,
                        goto decline;
                }
                /* QP confirmation over RoCE fabric */
+               smc_llc_flow_initiate(link->lgr, SMC_LLC_FLOW_ADD_LINK);
                reason_code = smcr_serv_conf_first_link(new_smc);
+               smc_llc_flow_stop(link->lgr, &link->lgr->llc_flow_lcl);
                if (reason_code)
                        goto decline;
        }
index 51366a9f49800f5aa4ca063172fd5fc11c1211c7..01a9cb885ef29fb56cc611031ad9b8aa08595fda 100644 (file)
@@ -121,11 +121,8 @@ struct smc_link {
 
        enum smc_link_state     state;          /* state of link */
        struct completion       llc_confirm;    /* wait for rx of conf link */
-       struct completion       llc_confirm_resp; /* wait 4 rx of cnf lnk rsp */
        int                     llc_confirm_rc; /* rc from confirm link msg */
-       int                     llc_confirm_resp_rc; /* rc from conf_resp msg */
        struct completion       llc_add;        /* wait for rx of add link */
-       struct completion       llc_add_resp;   /* wait for rx of add link rsp*/
        struct delayed_work     llc_testlink_wrk; /* testlink worker */
        struct completion       llc_testlink_resp; /* wait for rx of testlink */
        int                     llc_testlink_time; /* testlink interval */
index 9248b90fe37e311caa310d67100a00a46779eae8..5381b16fd482ba9786a41e0601e655bf3d8d68e9 100644 (file)
@@ -724,26 +724,18 @@ static void smc_llc_rx_response(struct smc_link *link,
 {
        u8 llc_type = qentry->msg.raw.hdr.common.type;
        union smc_llc_msg *llc = &qentry->msg;
-       int rc = 0;
 
        switch (llc_type) {
        case SMC_LLC_TEST_LINK:
                if (link->state == SMC_LNK_ACTIVE)
                        complete(&link->llc_testlink_resp);
                break;
-       case SMC_LLC_CONFIRM_LINK:
-               if (!(llc->raw.hdr.flags & SMC_LLC_FLAG_NO_RMBE_EYEC))
-                       rc = ENOTSUPP;
-               if (link->lgr->role == SMC_SERV &&
-                   link->state == SMC_LNK_ACTIVATING) {
-                       link->llc_confirm_resp_rc = rc;
-                       complete(&link->llc_confirm_resp);
-               }
-               break;
        case SMC_LLC_ADD_LINK:
-               if (link->state == SMC_LNK_ACTIVATING)
-                       complete(&link->llc_add_resp);
-               break;
+       case SMC_LLC_CONFIRM_LINK:
+               /* assign responses to the local flow, we requested them */
+               smc_llc_flow_qentry_set(&link->lgr->llc_flow_lcl, qentry);
+               wake_up_interruptible(&link->lgr->llc_waiter);
+               return;
        case SMC_LLC_DELETE_LINK:
                if (link->lgr->role == SMC_SERV)
                        smc_lgr_schedule_free_work_fast(link->lgr);
@@ -866,9 +858,7 @@ void smc_llc_lgr_clear(struct smc_link_group *lgr)
 int smc_llc_link_init(struct smc_link *link)
 {
        init_completion(&link->llc_confirm);
-       init_completion(&link->llc_confirm_resp);
        init_completion(&link->llc_add);
-       init_completion(&link->llc_add_resp);
        init_completion(&link->llc_confirm_rkey_resp);
        init_completion(&link->llc_delete_rkey_resp);
        mutex_init(&link->llc_delete_rkey_mutex);