Whamcloud - gitweb
LU-9094 lnet: remove ni from lnet_finalize
[fs/lustre-release.git] / lnet / klnds / o2iblnd / o2iblnd_cb.c
index 77a5a28..91a4561 100644 (file)
@@ -46,25 +46,24 @@ static int kiblnd_init_rdma(kib_conn_t *conn, kib_tx_t *tx, int type,
                            int resid, kib_rdma_desc_t *dstrd, __u64 dstcookie);
 static void kiblnd_queue_tx_locked(kib_tx_t *tx, kib_conn_t *conn);
 static void kiblnd_queue_tx(kib_tx_t *tx, kib_conn_t *conn);
-static void kiblnd_unmap_tx(struct lnet_ni *ni, kib_tx_t *tx);
+
+static void kiblnd_unmap_tx(kib_tx_t *tx);
 static void kiblnd_check_sends_locked(kib_conn_t *conn);
 
 void
-kiblnd_tx_done(struct lnet_ni *ni, kib_tx_t *tx)
+kiblnd_tx_done(kib_tx_t *tx)
 {
        struct lnet_msg *lntmsg[2];
-       kib_net_t  *net = ni->ni_data;
        int         rc;
        int         i;
 
-       LASSERT (net != NULL);
        LASSERT (!in_interrupt());
        LASSERT (!tx->tx_queued);               /* mustn't be queued for sending */
        LASSERT (tx->tx_sending == 0);          /* mustn't be awaiting sent callback */
        LASSERT (!tx->tx_waiting);              /* mustn't be awaiting peer_ni response */
        LASSERT (tx->tx_pool != NULL);
 
-       kiblnd_unmap_tx(ni, tx);
+       kiblnd_unmap_tx(tx);
 
        /* tx may have up to 2 lnet msgs to finalise */
        lntmsg[0] = tx->tx_lntmsg[0]; tx->tx_lntmsg[0] = NULL;
@@ -72,8 +71,6 @@ kiblnd_tx_done(struct lnet_ni *ni, kib_tx_t *tx)
        rc = tx->tx_status;
 
        if (tx->tx_conn != NULL) {
-               LASSERT (ni == tx->tx_conn->ibc_peer->ibp_ni);
-
                kiblnd_conn_decref(tx->tx_conn);
                tx->tx_conn = NULL;
        }
@@ -88,12 +85,12 @@ kiblnd_tx_done(struct lnet_ni *ni, kib_tx_t *tx)
                if (lntmsg[i] == NULL)
                        continue;
 
-               lnet_finalize(ni, lntmsg[i], rc);
+               lnet_finalize(lntmsg[i], rc);
        }
 }
 
 void
-kiblnd_txlist_done(struct lnet_ni *ni, struct list_head *txlist, int status)
+kiblnd_txlist_done(struct list_head *txlist, int status)
 {
        kib_tx_t *tx;
 
@@ -104,7 +101,7 @@ kiblnd_txlist_done(struct lnet_ni *ni, struct list_head *txlist, int status)
                /* complete now */
                tx->tx_waiting = 0;
                tx->tx_status = status;
-               kiblnd_tx_done(ni, tx);
+               kiblnd_tx_done(tx);
        }
 }
 
@@ -282,7 +279,7 @@ kiblnd_handle_completion(kib_conn_t *conn, int txtype, int status, __u64 cookie)
        spin_unlock(&conn->ibc_lock);
 
        if (idle)
-               kiblnd_tx_done(ni, tx);
+               kiblnd_tx_done(tx);
 }
 
 static void
@@ -591,13 +588,9 @@ kiblnd_fmr_map_tx(kib_net_t *net, kib_tx_t *tx, kib_rdma_desc_t *rd, __u32 nob)
 }
 
 static void
-kiblnd_unmap_tx(struct lnet_ni *ni, kib_tx_t *tx)
+kiblnd_unmap_tx(kib_tx_t *tx)
 {
-       kib_net_t  *net = ni->ni_data;
-
-       LASSERT(net != NULL);
-
-       if (net->ibn_fmr_ps != NULL)
+       if (tx->fmr.fmr_pfmr != NULL)
                kiblnd_fmr_pool_unmap(&tx->fmr, tx->tx_status);
 
         if (tx->tx_nfrags != 0) {
@@ -805,7 +798,7 @@ __must_hold(&conn->ibc_lock)
                 * kiblnd_check_sends_locked will queue NOOP again when
                 * posted NOOPs complete */
                spin_unlock(&conn->ibc_lock);
-               kiblnd_tx_done(peer_ni->ibp_ni, tx);
+               kiblnd_tx_done(tx);
                spin_lock(&conn->ibc_lock);
                 CDEBUG(D_NET, "%s(%d): redundant or enough NOOP\n",
                        libcfs_nid2str(peer_ni->ibp_nid),
@@ -894,8 +887,8 @@ __must_hold(&conn->ibc_lock)
 
         kiblnd_close_conn(conn, rc);
 
-        if (done)
-                kiblnd_tx_done(peer_ni->ibp_ni, tx);
+       if (done)
+               kiblnd_tx_done(tx);
 
        spin_lock(&conn->ibc_lock);
 
@@ -1013,8 +1006,8 @@ kiblnd_tx_complete (kib_tx_t *tx, int status)
        kiblnd_check_sends_locked(conn);
        spin_unlock(&conn->ibc_lock);
 
-        if (idle)
-                kiblnd_tx_done(conn->ibc_peer->ibp_ni, tx);
+       if (idle)
+               kiblnd_tx_done(tx);
 }
 
 static void
@@ -1356,7 +1349,7 @@ kiblnd_reconnect_peer(kib_peer_ni_t *peer_ni)
 
        CWARN("Abort reconnection of %s: %s\n",
              libcfs_nid2str(peer_ni->ibp_nid), reason);
-       kiblnd_txlist_done(peer_ni->ibp_ni, &txs, -ECONNABORTED);
+       kiblnd_txlist_done(&txs, -ECONNABORTED);
        return false;
 }
 
@@ -1429,7 +1422,7 @@ kiblnd_launch_tx(struct lnet_ni *ni, kib_tx_t *tx, lnet_nid_t nid)
                if (tx != NULL) {
                        tx->tx_status = -EHOSTUNREACH;
                        tx->tx_waiting = 0;
-                       kiblnd_tx_done(ni, tx);
+                       kiblnd_tx_done(tx);
                }
                return;
        }
@@ -1551,7 +1544,7 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg)
                if (rc != 0) {
                        CERROR("Can't setup GET sink for %s: %d\n",
                               libcfs_nid2str(target.nid), rc);
-                       kiblnd_tx_done(ni, tx);
+                       kiblnd_tx_done(tx);
                        return -EIO;
                }
 
@@ -1562,12 +1555,12 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg)
                 kiblnd_init_tx_msg(ni, tx, IBLND_MSG_GET_REQ, nob);
 
                 tx->tx_lntmsg[1] = lnet_create_reply_msg(ni, lntmsg);
-                if (tx->tx_lntmsg[1] == NULL) {
-                        CERROR("Can't create reply for GET -> %s\n",
-                               libcfs_nid2str(target.nid));
-                        kiblnd_tx_done(ni, tx);
-                        return -EIO;
-                }
+               if (tx->tx_lntmsg[1] == NULL) {
+                       CERROR("Can't create reply for GET -> %s\n",
+                              libcfs_nid2str(target.nid));
+                       kiblnd_tx_done(tx);
+                       return -EIO;
+               }
 
                 tx->tx_lntmsg[0] = lntmsg;      /* finalise lntmsg[0,1] on completion */
                 tx->tx_waiting = 1;             /* waiting for GET_DONE */
@@ -1597,12 +1590,12 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg)
                         rc = kiblnd_setup_rd_kiov(ni, tx, tx->tx_rd,
                                                   payload_niov, payload_kiov,
                                                   payload_offset, payload_nob);
-                if (rc != 0) {
-                        CERROR("Can't setup PUT src for %s: %d\n",
-                               libcfs_nid2str(target.nid), rc);
-                        kiblnd_tx_done(ni, tx);
-                        return -EIO;
-                }
+               if (rc != 0) {
+                       CERROR("Can't setup PUT src for %s: %d\n",
+                              libcfs_nid2str(target.nid), rc);
+                       kiblnd_tx_done(tx);
+                       return -EIO;
+               }
 
                 ibmsg = tx->tx_msg;
                 ibmsg->ibm_u.putreq.ibprm_hdr = *hdr;
@@ -1692,23 +1685,23 @@ kiblnd_reply(struct lnet_ni *ni, kib_rx_t *rx, struct lnet_msg *lntmsg)
                        libcfs_nid2str(target.nid), rc);
                 goto failed_1;
         }
-        
-        if (nob == 0) {
-                /* No RDMA: local completion may happen now! */
-                lnet_finalize(ni, lntmsg, 0);
-        } else {
-                /* RDMA: lnet_finalize(lntmsg) when it
-                 * completes */
-                tx->tx_lntmsg[0] = lntmsg;
-        }
+
+       if (nob == 0) {
+               /* No RDMA: local completion may happen now! */
+               lnet_finalize(lntmsg, 0);
+       } else {
+               /* RDMA: lnet_finalize(lntmsg) when it
+                * completes */
+               tx->tx_lntmsg[0] = lntmsg;
+       }
 
         kiblnd_queue_tx(tx, rx->rx_conn);
         return;
 
  failed_1:
-        kiblnd_tx_done(ni, tx);
+       kiblnd_tx_done(tx);
  failed_0:
-        lnet_finalize(ni, lntmsg, -EIO);
+       lnet_finalize(lntmsg, -EIO);
 }
 
 int
@@ -1720,6 +1713,7 @@ kiblnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg,
         kib_msg_t   *rxmsg = rx->rx_msg;
         kib_conn_t  *conn = rx->rx_conn;
         kib_tx_t    *tx;
+       __u64        ibprm_cookie;
        int          nob;
        int          post_credit = IBLND_POSTRX_PEER_CREDIT;
        int          rc = 0;
@@ -1753,19 +1747,20 @@ kiblnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg,
                                            IBLND_MSG_SIZE, rxmsg,
                                            offsetof(kib_msg_t, ibm_u.immediate.ibim_payload),
                                            mlen);
-                lnet_finalize (ni, lntmsg, 0);
-                break;
+               lnet_finalize(lntmsg, 0);
+               break;
 
        case IBLND_MSG_PUT_REQ: {
                kib_msg_t       *txmsg;
                kib_rdma_desc_t *rd;
+               ibprm_cookie = rxmsg->ibm_u.putreq.ibprm_cookie;
 
-                if (mlen == 0) {
-                        lnet_finalize(ni, lntmsg, 0);
-                        kiblnd_send_completion(rx->rx_conn, IBLND_MSG_PUT_NAK, 0,
-                                               rxmsg->ibm_u.putreq.ibprm_cookie);
-                        break;
-                }
+               if (mlen == 0) {
+                       lnet_finalize(lntmsg, 0);
+                       kiblnd_send_completion(rx->rx_conn, IBLND_MSG_PUT_NAK,
+                                              0, ibprm_cookie);
+                       break;
+               }
 
                tx = kiblnd_get_idle_tx(ni, conn->ibc_peer->ibp_nid);
                 if (tx == NULL) {
@@ -1787,15 +1782,15 @@ kiblnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg,
                if (rc != 0) {
                        CERROR("Can't setup PUT sink for %s: %d\n",
                               libcfs_nid2str(conn->ibc_peer->ibp_nid), rc);
-                       kiblnd_tx_done(ni, tx);
+                       kiblnd_tx_done(tx);
                        /* tell peer_ni it's over */
-                       kiblnd_send_completion(rx->rx_conn, IBLND_MSG_PUT_NAK, rc,
-                                              rxmsg->ibm_u.putreq.ibprm_cookie);
+                       kiblnd_send_completion(rx->rx_conn, IBLND_MSG_PUT_NAK,
+                                              rc, ibprm_cookie);
                        break;
                }
 
                nob = offsetof(kib_putack_msg_t, ibpam_rd.rd_frags[rd->rd_nfrags]);
-               txmsg->ibm_u.putack.ibpam_src_cookie = rxmsg->ibm_u.putreq.ibprm_cookie;
+               txmsg->ibm_u.putack.ibpam_src_cookie = ibprm_cookie;
                txmsg->ibm_u.putack.ibpam_dst_cookie = tx->tx_cookie;
 
                 kiblnd_init_tx_msg(ni, tx, IBLND_MSG_PUT_ACK, nob);
@@ -2013,7 +2008,7 @@ kiblnd_abort_txs(kib_conn_t *conn, struct list_head *txs)
 
        spin_unlock(&conn->ibc_lock);
 
-       kiblnd_txlist_done(conn->ibc_peer->ibp_ni, &zombies, -ECONNABORTED);
+       kiblnd_txlist_done(&zombies, -ECONNABORTED);
 }
 
 static void
@@ -2092,7 +2087,7 @@ kiblnd_peer_connect_failed(kib_peer_ni_t *peer_ni, int active, int error)
        CNETERR("Deleting messages for %s: connection failed\n",
                libcfs_nid2str(peer_ni->ibp_nid));
 
-       kiblnd_txlist_done(peer_ni->ibp_ni, &zombies, -EHOSTUNREACH);
+       kiblnd_txlist_done(&zombies, -EHOSTUNREACH);
 }
 
 static void
@@ -2162,13 +2157,12 @@ kiblnd_connreq_done(kib_conn_t *conn, int status)
 
         if (!kiblnd_peer_active(peer_ni) ||        /* peer_ni has been deleted */
             conn->ibc_comms_error != 0) {       /* error has happened already */
-               struct lnet_ni *ni = peer_ni->ibp_ni;
 
                 /* start to shut down connection */
                 kiblnd_close_conn_locked(conn, -ECONNABORTED);
                write_unlock_irqrestore(&kiblnd_data.kib_global_lock, flags);
 
-               kiblnd_txlist_done(ni, &txs, -ECONNABORTED);
+               kiblnd_txlist_done(&txs, -ECONNABORTED);
 
                return;
        }