Whamcloud - gitweb
LU-6142 lnet: convert kiblnd/ksocknal_thread_start to vararg
[fs/lustre-release.git] / lnet / klnds / o2iblnd / o2iblnd_cb.c
index 9fd0baa..38c91a7 100644 (file)
@@ -811,6 +811,7 @@ __must_hold(&conn->ibc_lock)
        struct kib_msg *msg = tx->tx_msg;
        struct kib_peer_ni *peer_ni = conn->ibc_peer;
        struct lnet_ni *ni = peer_ni->ibp_ni;
+       struct kib_fast_reg_descriptor *frd = tx->tx_fmr.fmr_frd;
        int ver = conn->ibc_version;
        int rc;
        int done;
@@ -895,11 +896,10 @@ __must_hold(&conn->ibc_lock)
                 /* close_conn will launch failover */
                 rc = -ENETDOWN;
         } else {
-               struct kib_fast_reg_descriptor *frd = tx->tx_fmr.fmr_frd;
                struct ib_send_wr *bad = &tx->tx_wrq[tx->tx_nwrq - 1].wr;
                struct ib_send_wr *wr  = &tx->tx_wrq[0].wr;
 
-               if (frd != NULL) {
+               if (frd != NULL && !frd->frd_posted) {
                        if (!frd->frd_valid) {
                                wr = &frd->frd_inv_wr.wr;
                                wr->next = &frd->frd_fastreg_wr.wr;
@@ -928,8 +928,11 @@ __must_hold(&conn->ibc_lock)
 
        conn->ibc_last_send = ktime_get();
 
-        if (rc == 0)
-                return 0;
+       if (rc == 0) {
+               if (frd != NULL)
+                       frd->frd_posted = true;
+               return 0;
+       }
 
         /* NB credits are transferred in the actual
          * message, which can only be the last work item */
@@ -1653,7 +1656,7 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg)
 
                 /* is the REPLY message too small for RDMA? */
                nob = offsetof(struct kib_msg, ibm_u.immediate.ibim_payload[lntmsg->msg_md->md_length]);
-                if (nob <= IBLND_MSG_SIZE)
+                if (nob <= IBLND_MSG_SIZE && !lntmsg->msg_rdma_force)
                         break;                  /* send IMMEDIATE */
 
                tx = kiblnd_get_idle_tx(ni, target.nid);
@@ -1700,7 +1703,7 @@ kiblnd_send(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg)
         case LNET_MSG_PUT:
                 /* Is the payload small enough not to need RDMA? */
                nob = offsetof(struct kib_msg, ibm_u.immediate.ibim_payload[payload_nob]);
-                if (nob <= IBLND_MSG_SIZE)
+                if (nob <= IBLND_MSG_SIZE && !lntmsg->msg_rdma_force)
                         break;                  /* send IMMEDIATE */
 
                tx = kiblnd_get_idle_tx(ni, target.nid);
@@ -1928,18 +1931,6 @@ kiblnd_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg,
         return rc;
 }
 
-int
-kiblnd_thread_start(int (*fn)(void *arg), void *arg, char *name)
-{
-       struct task_struct *task = kthread_run(fn, arg, "%s", name);
-
-       if (IS_ERR(task))
-               return PTR_ERR(task);
-
-       atomic_inc(&kiblnd_data.kib_nthreads);
-       return 0;
-}
-
 static void
 kiblnd_thread_fini (void)
 {