net/smc: convert static link ID instances to support multiple links
[linux-2.6-microblaze.git] / net / smc / af_smc.c
index 6fd44bd..890dc64 100644 (file)
@@ -338,36 +338,54 @@ static void smc_copy_sock_settings_to_smc(struct smc_sock *smc)
 }
 
 /* register a new rmb, send confirm_rkey msg to register with peer */
-static int smc_reg_rmb(struct smc_link *link, struct smc_buf_desc *rmb_desc,
-                      bool conf_rkey)
+static int smcr_link_reg_rmb(struct smc_link *link,
+                            struct smc_buf_desc *rmb_desc, bool conf_rkey)
 {
-       if (!rmb_desc->wr_reg) {
+       if (!rmb_desc->is_reg_mr[link->link_idx]) {
                /* register memory region for new rmb */
-               if (smc_wr_reg_send(link, rmb_desc->mr_rx[SMC_SINGLE_LINK])) {
-                       rmb_desc->regerr = 1;
+               if (smc_wr_reg_send(link, rmb_desc->mr_rx[link->link_idx])) {
+                       rmb_desc->is_reg_err = true;
                        return -EFAULT;
                }
-               rmb_desc->wr_reg = 1;
+               rmb_desc->is_reg_mr[link->link_idx] = true;
        }
        if (!conf_rkey)
                return 0;
+
        /* exchange confirm_rkey msg with peer */
-       if (smc_llc_do_confirm_rkey(link, rmb_desc)) {
-               rmb_desc->regerr = 1;
-               return -EFAULT;
+       if (!rmb_desc->is_conf_rkey) {
+               if (smc_llc_do_confirm_rkey(link, rmb_desc)) {
+                       rmb_desc->is_reg_err = true;
+                       return -EFAULT;
+               }
+               rmb_desc->is_conf_rkey = true;
+       }
+       return 0;
+}
+
+/* register the new rmb on all links */
+static int smcr_lgr_reg_rmbs(struct smc_link_group *lgr,
+                            struct smc_buf_desc *rmb_desc)
+{
+       int i, rc;
+
+       for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
+               if (lgr->lnk[i].state != SMC_LNK_ACTIVE)
+                       continue;
+               rc = smcr_link_reg_rmb(&lgr->lnk[i], rmb_desc, true);
+               if (rc)
+                       return rc;
        }
        return 0;
 }
 
-static int smc_clnt_conf_first_link(struct smc_sock *smc)
+static int smcr_clnt_conf_first_link(struct smc_sock *smc)
 {
        struct net *net = sock_net(smc->clcsock->sk);
-       struct smc_link_group *lgr = smc->conn.lgr;
-       struct smc_link *link;
+       struct smc_link *link = smc->conn.lnk;
        int rest;
        int rc;
 
-       link = &lgr->lnk[SMC_SINGLE_LINK];
        /* receive CONFIRM LINK request from server over RoCE fabric */
        rest = wait_for_completion_interruptible_timeout(
                &link->llc_confirm,
@@ -389,7 +407,7 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc)
 
        smc_wr_remember_qp_attr(link);
 
-       if (smc_reg_rmb(link, smc->conn.rmb_desc, false))
+       if (smcr_link_reg_rmb(link, smc->conn.rmb_desc, false))
                return SMC_CLC_DECL_ERR_REGRMB;
 
        /* send CONFIRM LINK response over RoCE fabric */
@@ -610,7 +628,7 @@ static int smc_connect_rdma(struct smc_sock *smc,
                mutex_unlock(&smc_client_lgr_pending);
                return reason_code;
        }
-       link = &smc->conn.lgr->lnk[SMC_SINGLE_LINK];
+       link = smc->conn.lnk;
 
        smc_conn_save_peer_info(smc, aclc);
 
@@ -634,7 +652,7 @@ static int smc_connect_rdma(struct smc_sock *smc,
                        return smc_connect_abort(smc, SMC_CLC_DECL_ERR_RDYLNK,
                                                 ini->cln_first_contact);
        } else {
-               if (smc_reg_rmb(link, smc->conn.rmb_desc, true))
+               if (smcr_lgr_reg_rmbs(smc->conn.lgr, smc->conn.rmb_desc))
                        return smc_connect_abort(smc, SMC_CLC_DECL_ERR_REGRMB,
                                                 ini->cln_first_contact);
        }
@@ -649,7 +667,7 @@ static int smc_connect_rdma(struct smc_sock *smc,
 
        if (ini->cln_first_contact == SMC_FIRST_CONTACT) {
                /* QP confirmation over RoCE fabric */
-               reason_code = smc_clnt_conf_first_link(smc);
+               reason_code = smcr_clnt_conf_first_link(smc);
                if (reason_code)
                        return smc_connect_abort(smc, reason_code,
                                                 ini->cln_first_contact);
@@ -999,17 +1017,14 @@ void smc_close_non_accepted(struct sock *sk)
        sock_put(sk); /* final sock_put */
 }
 
-static int smc_serv_conf_first_link(struct smc_sock *smc)
+static int smcr_serv_conf_first_link(struct smc_sock *smc)
 {
        struct net *net = sock_net(smc->clcsock->sk);
-       struct smc_link_group *lgr = smc->conn.lgr;
-       struct smc_link *link;
+       struct smc_link *link = smc->conn.lnk;
        int rest;
        int rc;
 
-       link = &lgr->lnk[SMC_SINGLE_LINK];
-
-       if (smc_reg_rmb(link, smc->conn.rmb_desc, false))
+       if (smcr_link_reg_rmb(link, smc->conn.rmb_desc, false))
                return SMC_CLC_DECL_ERR_REGRMB;
 
        /* send CONFIRM LINK request to client over the RoCE fabric */
@@ -1194,10 +1209,10 @@ static int smc_listen_ism_init(struct smc_sock *new_smc,
 /* listen worker: register buffers */
 static int smc_listen_rdma_reg(struct smc_sock *new_smc, int local_contact)
 {
-       struct smc_link *link = &new_smc->conn.lgr->lnk[SMC_SINGLE_LINK];
+       struct smc_connection *conn = &new_smc->conn;
 
        if (local_contact != SMC_FIRST_CONTACT) {
-               if (smc_reg_rmb(link, new_smc->conn.rmb_desc, true))
+               if (smcr_lgr_reg_rmbs(conn->lgr, conn->rmb_desc))
                        return SMC_CLC_DECL_ERR_REGRMB;
        }
        smc_rmb_sync_sg_for_device(&new_smc->conn);
@@ -1210,7 +1225,7 @@ static int smc_listen_rdma_finish(struct smc_sock *new_smc,
                                  struct smc_clc_msg_accept_confirm *cclc,
                                  int local_contact)
 {
-       struct smc_link *link = &new_smc->conn.lgr->lnk[SMC_SINGLE_LINK];
+       struct smc_link *link = new_smc->conn.lnk;
        int reason_code = 0;
 
        if (local_contact == SMC_FIRST_CONTACT)
@@ -1227,7 +1242,7 @@ static int smc_listen_rdma_finish(struct smc_sock *new_smc,
                        goto decline;
                }
                /* QP confirmation over RoCE fabric */
-               reason_code = smc_serv_conf_first_link(new_smc);
+               reason_code = smcr_serv_conf_first_link(new_smc);
                if (reason_code)
                        goto decline;
        }