Whamcloud - gitweb
LU-11300 lnet: remove lnd_query interface.
[fs/lustre-release.git] / lnet / klnds / o2iblnd / o2iblnd_cb.c
index d6dc96f..82c4509 100644 (file)
@@ -203,7 +203,12 @@ kiblnd_post_rx(struct kib_rx *rx, int credit)
         * own this rx (and rx::rx_conn) anymore, LU-5678.
         */
        kiblnd_conn_addref(conn);
+#ifdef HAVE_IB_POST_SEND_RECV_CONST
+       rc = ib_post_recv(conn->ibc_cmid->qp, &rx->rx_wrq,
+                         (const struct ib_recv_wr **)&bad_wrq);
+#else
        rc = ib_post_recv(conn->ibc_cmid->qp, &rx->rx_wrq, &bad_wrq);
+#endif
        if (unlikely(rc != 0)) {
                CERROR("Can't post rx for %s: %d, bad_wrq: %p\n",
                       libcfs_nid2str(conn->ibc_peer->ibp_nid), rc, bad_wrq);
@@ -974,7 +979,12 @@ __must_hold(&conn->ibc_lock)
                if (lnet_send_error_simulation(tx->tx_lntmsg[0], &tx->tx_hstatus))
                        rc = -EINVAL;
                else
+#ifdef HAVE_IB_POST_SEND_RECV_CONST
+                       rc = ib_post_send(conn->ibc_cmid->qp, wr,
+                                         (const struct ib_send_wr **)&bad);
+#else
                        rc = ib_post_send(conn->ibc_cmid->qp, wr, &bad);
+#endif
        }
 
        conn->ibc_last_send = ktime_get();
@@ -1041,8 +1051,7 @@ kiblnd_check_sends_locked(struct kib_conn *conn)
               !list_empty(&conn->ibc_tx_queue_rsrvd)) {
                tx = list_entry(conn->ibc_tx_queue_rsrvd.next,
                                struct kib_tx, tx_list);
-               list_del(&tx->tx_list);
-               list_add_tail(&tx->tx_list, &conn->ibc_tx_queue);
+               list_move_tail(&tx->tx_list, &conn->ibc_tx_queue);
                 conn->ibc_reserved_credits--;
         }
 
@@ -1283,6 +1292,21 @@ kiblnd_queue_tx_locked(struct kib_tx *tx, struct kib_conn *conn)
        LASSERT(!tx->tx_queued);        /* not queued for sending already */
        LASSERT(conn->ibc_state >= IBLND_CONN_ESTABLISHED);
 
+       if (conn->ibc_state >= IBLND_CONN_DISCONNECTED) {
+               tx->tx_status = -ECONNABORTED;
+               tx->tx_waiting = 0;
+               if (tx->tx_conn != NULL) {
+                       /* PUT_DONE first attached to conn as a PUT_REQ */
+                       LASSERT(tx->tx_conn == conn);
+                       LASSERT(tx->tx_msg->ibm_type == IBLND_MSG_PUT_DONE);
+                       tx->tx_conn = NULL;
+                       kiblnd_conn_decref(conn);
+               }
+               list_add(&tx->tx_list, &conn->ibc_zombie_txs);
+
+               return;
+       }
+
        timeout_ns = lnet_get_lnd_timeout() * NSEC_PER_SEC;
        tx->tx_queued = 1;
        tx->tx_deadline = ktime_add_ns(ktime_get(), timeout_ns);
@@ -1387,8 +1411,9 @@ kiblnd_connect_peer(struct kib_peer_ni *peer_ni)
         LASSERT (net != NULL);
         LASSERT (peer_ni->ibp_connecting > 0);
 
-        cmid = kiblnd_rdma_create_id(kiblnd_cm_callback, peer_ni, RDMA_PS_TCP,
-                                     IB_QPT_RC);
+       cmid = kiblnd_rdma_create_id(peer_ni->ibp_ni->ni_net_ns,
+                                    kiblnd_cm_callback, peer_ni,
+                                    RDMA_PS_TCP, IB_QPT_RC);
 
         if (IS_ERR(cmid)) {
                 CERROR("Can't create CMID for %s: %ld\n",
@@ -1439,12 +1464,10 @@ kiblnd_connect_peer(struct kib_peer_ni *peer_ni)
 bool
 kiblnd_reconnect_peer(struct kib_peer_ni *peer_ni)
 {
-       rwlock_t         *glock = &kiblnd_data.kib_global_lock;
-       char             *reason = NULL;
-       struct list_head  txs;
-       unsigned long     flags;
-
-       INIT_LIST_HEAD(&txs);
+       rwlock_t *glock = &kiblnd_data.kib_global_lock;
+       char *reason = NULL;
+       LIST_HEAD(txs);
+       unsigned long flags;
 
        write_lock_irqsave(glock, flags);
        if (peer_ni->ibp_reconnecting == 0) {
@@ -1994,24 +2017,24 @@ kiblnd_peer_alive(struct kib_peer_ni *peer_ni)
 static void
 kiblnd_peer_notify(struct kib_peer_ni *peer_ni)
 {
-        int           error = 0;
+       int           error = 0;
        time64_t last_alive = 0;
-        unsigned long flags;
+       unsigned long flags;
 
        read_lock_irqsave(&kiblnd_data.kib_global_lock, flags);
 
        if (kiblnd_peer_idle(peer_ni) && peer_ni->ibp_error != 0) {
-                error = peer_ni->ibp_error;
-                peer_ni->ibp_error = 0;
+               error = peer_ni->ibp_error;
+               peer_ni->ibp_error = 0;
 
-                last_alive = peer_ni->ibp_last_alive;
-        }
+               last_alive = peer_ni->ibp_last_alive;
+       }
 
        read_unlock_irqrestore(&kiblnd_data.kib_global_lock, flags);
 
-        if (error != 0)
-                lnet_notify(peer_ni->ibp_ni,
-                            peer_ni->ibp_nid, 0, last_alive);
+       if (error != 0)
+               lnet_notify(peer_ni->ibp_ni,
+                           peer_ni->ibp_nid, false, false, last_alive);
 }
 
 void
@@ -2122,10 +2145,10 @@ kiblnd_handle_early_rxs(struct kib_conn *conn)
        write_unlock_irqrestore(&kiblnd_data.kib_global_lock, flags);
 }
 
-static void
+void
 kiblnd_abort_txs(struct kib_conn *conn, struct list_head *txs)
 {
-       struct list_head         zombies = LIST_HEAD_INIT(zombies);
+       LIST_HEAD(zombies);
        struct list_head        *tmp;
        struct list_head        *nxt;
        struct kib_tx *tx;
@@ -2170,8 +2193,7 @@ kiblnd_abort_txs(struct kib_conn *conn, struct list_head *txs)
                 */
                if (tx->tx_sending == 0) {
                        tx->tx_queued = 0;
-                       list_del(&tx->tx_list);
-                       list_add(&tx->tx_list, &zombies);
+                       list_move(&tx->tx_list, &zombies);
                }
        }
 
@@ -2192,13 +2214,13 @@ kiblnd_finalise_conn(struct kib_conn *conn)
        LASSERT (!in_interrupt());
        LASSERT (conn->ibc_state > IBLND_CONN_INIT);
 
-       kiblnd_set_conn_state(conn, IBLND_CONN_DISCONNECTED);
-
        /* abort_receives moves QP state to IB_QPS_ERR.  This is only required
         * for connections that didn't get as far as being connected, because
         * rdma_disconnect() does this for free. */
        kiblnd_abort_receives(conn);
 
+       kiblnd_set_conn_state(conn, IBLND_CONN_DISCONNECTED);
+
        /* Complete all tx descs not waiting for sends to complete.
         * NB we should be safe from RDMA now that the QP has changed state */
 
@@ -2215,7 +2237,7 @@ static void
 kiblnd_peer_connect_failed(struct kib_peer_ni *peer_ni, int active,
                           int error)
 {
-       struct list_head zombies = LIST_HEAD_INIT(zombies);
+       LIST_HEAD(zombies);
        unsigned long   flags;
 
        LASSERT (error != 0);
@@ -2271,7 +2293,7 @@ kiblnd_connreq_done(struct kib_conn *conn, int status)
 {
        struct kib_peer_ni *peer_ni = conn->ibc_peer;
        struct kib_tx *tx;
-       struct list_head txs;
+       LIST_HEAD(txs);
        unsigned long    flags;
        int              active;
 
@@ -2328,7 +2350,6 @@ kiblnd_connreq_done(struct kib_conn *conn, int status)
         }
 
        /* grab pending txs while I have the lock */
-       INIT_LIST_HEAD(&txs);
        list_splice_init(&peer_ni->ibp_tx_queue, &txs);
 
         if (!kiblnd_peer_active(peer_ni) ||        /* peer_ni has been deleted */
@@ -2730,11 +2751,12 @@ kiblnd_check_reconnect(struct kib_conn *conn, int version,
        }
 
        write_lock_irqsave(glock, flags);
-        /* retry connection if it's still needed and no other connection
-         * attempts (active or passive) are in progress
-         * NB: reconnect is still needed even when ibp_tx_queue is
-         * empty if ibp_version != version because reconnect may be
-         * initiated by kiblnd_query() */
+       /* retry connection if it's still needed and no other connection
+        * attempts (active or passive) are in progress
+        * NB: reconnect is still needed even when ibp_tx_queue is
+        * empty if ibp_version != version because reconnect may be
+        * initiated.
+        */
        reconnect = (!list_empty(&peer_ni->ibp_tx_queue) ||
                     peer_ni->ibp_version != version) &&
                    peer_ni->ibp_connecting &&
@@ -3343,9 +3365,9 @@ kiblnd_conn_timed_out_locked(struct kib_conn *conn)
 static void
 kiblnd_check_conns (int idx)
 {
-       struct list_head  closes = LIST_HEAD_INIT(closes);
-       struct list_head  checksends = LIST_HEAD_INIT(checksends);
-       struct list_head  timedout_txs = LIST_HEAD_INIT(timedout_txs);
+       LIST_HEAD(closes);
+       LIST_HEAD(checksends);
+       LIST_HEAD(timedout_txs);
        struct list_head *peers = &kiblnd_data.kib_peers[idx];
        struct list_head *ptmp;
        struct kib_peer_ni *peer_ni;
@@ -3592,7 +3614,7 @@ kiblnd_connd (void *arg)
                                             kiblnd_data.kib_peer_hash_size;
                        }
 
-                       deadline += msecs_to_jiffies(p * MSEC_PER_SEC);
+                       deadline += cfs_time_seconds(p);
                        spin_lock_irqsave(lock, flags);
                }
 
@@ -3876,6 +3898,7 @@ kiblnd_failover_thread(void *arg)
 {
        rwlock_t        *glock = &kiblnd_data.kib_global_lock;
        struct kib_dev *dev;
+       struct net *ns = arg;
        wait_queue_entry_t wait;
        unsigned long    flags;
        int              rc;
@@ -3904,7 +3927,7 @@ kiblnd_failover_thread(void *arg)
                         dev->ibd_failover = 1;
                        write_unlock_irqrestore(glock, flags);
 
-                       rc = kiblnd_dev_failover(dev);
+                       rc = kiblnd_dev_failover(dev, ns);
 
                        write_lock_irqsave(glock, flags);