net/smc: final part of add link processing as SMC server
authorKarsten Graul <kgraul@linux.ibm.com>
Sun, 3 May 2020 12:38:45 +0000 (14:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 3 May 2020 23:07:01 +0000 (16:07 -0700)
This patch finalizes the ADD_LINK processing of new links. Send the
CONFIRM_LINK request to the peer, receive the response and set link
state to ACTIVE.

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/smc_llc.c

index de73432..1fefee5 100644 (file)
@@ -904,6 +904,33 @@ out:
        return rc;
 }
 
+static int smc_llc_srv_conf_link(struct smc_link *link,
+                                struct smc_link *link_new,
+                                enum smc_lgr_type lgr_new_t)
+{
+       struct smc_link_group *lgr = link->lgr;
+       struct smc_llc_qentry *qentry = NULL;
+       int rc;
+
+       /* send CONFIRM LINK request over the RoCE fabric */
+       rc = smc_llc_send_confirm_link(link_new, SMC_LLC_REQ);
+       if (rc)
+               return -ENOLINK;
+       /* receive CONFIRM LINK response over the RoCE fabric */
+       qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_FIRST_TIME,
+                             SMC_LLC_CONFIRM_LINK);
+       if (!qentry) {
+               /* send DELETE LINK */
+               smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ,
+                                        false, SMC_LLC_DEL_LOST_PATH);
+               return -ENOLINK;
+       }
+       smc_llc_link_active(link_new);
+       lgr->type = lgr_new_t;
+       smc_llc_flow_qentry_del(&lgr->llc_flow_lcl);
+       return 0;
+}
+
 int smc_llc_srv_add_link(struct smc_link *link)
 {
        enum smc_lgr_type lgr_new_t = SMC_LGR_SYMMETRIC;
@@ -967,7 +994,7 @@ int smc_llc_srv_add_link(struct smc_link *link)
        rc = smc_llc_srv_rkey_exchange(link, link_new);
        if (rc)
                goto out_err;
-       /* tbd: rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t); */
+       rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t);
        if (rc)
                goto out_err;
        return 0;