Whamcloud - gitweb
* vibnal fixes
[fs/lustre-release.git] / lnet / klnds / viblnd / viblnd_cb.c
index 9262416..477d190 100644 (file)
@@ -505,8 +505,9 @@ kibnal_append_rdfrag(kib_rdma_desc_t *rd, int active, struct page *page,
         kib_rdma_frag_t *frag = &rd->rd_frags[rd->rd_nfrag];
         vv_l_key_t       l_key;
         vv_r_key_t       r_key;
-        void            *addr;
-        void            *vaddr;
+        __u64            addr;
+        __u64            frag_addr;
+        void            *ptr;
         vv_mem_reg_h_t   mem_h;
         vv_return_t      vvrc;
 
@@ -515,14 +516,18 @@ kibnal_append_rdfrag(kib_rdma_desc_t *rd, int active, struct page *page,
                 return -EMSGSIZE;
         }
 
-        addr = (void *)(((unsigned long)kmap(page)) + page_offset);
+#if CONFIG_HIGHMEM
+# error "This probably doesn't work because of over/underflow when casting between __u64 and void *..."
+#endif
+        /* Try to create an address that adapter-tavor will munge into a valid
+         * network address, given how it maps all phys mem into 1 region */
+        addr = page_to_phys(page) + page_offset + PAGE_OFFSET;
 
-        vvrc = vv_get_gen_mr_attrib(kibnal_data.kib_hca, addr,
+        vvrc = vv_get_gen_mr_attrib(kibnal_data.kib_hca, 
+                                    (void *)((unsigned long)addr),
                                     len, &mem_h, &l_key, &r_key);
         LASSERT (vvrc == vv_return_ok);
 
-        kunmap(page);
-
         if (active) {
                 if (rd->rd_nfrag == 0) {
                         rd->rd_key = l_key;
@@ -530,7 +535,7 @@ kibnal_append_rdfrag(kib_rdma_desc_t *rd, int active, struct page *page,
                         CERROR ("> 1 key for single RDMA desc\n");
                         return -EINVAL;
                 }
-                vaddr = addr;
+                frag_addr = addr;
         } else {
                 if (rd->rd_nfrag == 0) {
                         rd->rd_key = r_key;
@@ -538,14 +543,16 @@ kibnal_append_rdfrag(kib_rdma_desc_t *rd, int active, struct page *page,
                         CERROR ("> 1 key for single RDMA desc\n");
                         return -EINVAL;
                 }
-                vv_va2advertise_addr(kibnal_data.kib_hca, addr, &vaddr);
+                vv_va2advertise_addr(kibnal_data.kib_hca, 
+                                     (void *)((unsigned long)addr), &ptr);
+                frag_addr = (unsigned long)ptr;
         }
 
-        kibnal_rf_set(frag, (unsigned long)vaddr, len);
+        kibnal_rf_set(frag, frag_addr, len);
 
-        CDEBUG(D_NET,"map frag [%d][%d %x %08x%08x] %p\n", 
+        CDEBUG(D_NET,"map frag [%d][%d %x %08x%08x] "LPX64"\n", 
                rd->rd_nfrag, frag->rf_nob, rd->rd_key, 
-               frag->rf_addr_hi, frag->rf_addr_lo, addr);
+               frag->rf_addr_hi, frag->rf_addr_lo, frag_addr);
 
         rd->rd_nfrag++;
         return 0;
@@ -943,7 +950,7 @@ kibnal_check_sends (kib_conn_t *conn)
                  * stashed on ibc_active_txs, matched by an incoming PUT_ACK,
                  * and then re-queued here.  It's (just) possible that
                  * tx_sending is non-zero if we've not done the tx_complete() from
-                 * the first send; hence the += rather than = below. */
+                 * the first send; hence the ++ rather than = below. */
                 tx->tx_sending++;
 
                 list_add (&tx->tx_list, &conn->ibc_active_txs);
@@ -958,61 +965,12 @@ kibnal_check_sends (kib_conn_t *conn)
                 vvrc = vv_return_ok;
                 if (conn->ibc_state == IBNAL_CONN_ESTABLISHED) {
                         tx->tx_status = 0;
-#if 1
                         vvrc = vv_post_send_list(kibnal_data.kib_hca,
                                                  conn->ibc_qp,
                                                  tx->tx_nwrq,
                                                  tx->tx_wrq,
                                                  vv_operation_type_send_rc);
                         rc = (vvrc == vv_return_ok) ? 0 : -EIO;
-#else
-                        /* Only post 1 item at a time for now (so we know
-                         * exactly how many got posted successfully) */
-                        for (i = 0; i < tx->tx_nwrq; i++) {
-                                switch (tx->tx_wrq[i].wr_type) {
-                                case vv_wr_send:
-                                        CDEBUG(D_NET, "[%d]posting send [%d %x %p]%s: %x\n", 
-                                               i,
-                                               tx->tx_wrq[i].scatgat_list->length,
-                                               tx->tx_wrq[i].scatgat_list->l_key,
-                                               tx->tx_wrq[i].scatgat_list->v_address,
-                                               tx->tx_wrq[i].type.send.send_qp_type.rc_type.fance_indicator ?
-                                               "(fence)":"",
-                                               tx->tx_msg->ibm_type);
-                                        break;
-                                case vv_wr_rdma_write:
-                                        CDEBUG(D_NET, "[%d]posting PUT  [%d %x %p]->[%x "LPX64"]\n", 
-                                               i,
-                                               tx->tx_wrq[i].scatgat_list->length,
-                                               tx->tx_wrq[i].scatgat_list->l_key,
-                                               tx->tx_wrq[i].scatgat_list->v_address,
-                                               tx->tx_wrq[i].type.send.send_qp_type.rc_type.r_r_key,
-                                               tx->tx_wrq[i].type.send.send_qp_type.rc_type.r_addr);
-                                        break;
-                                case vv_wr_rdma_read:
-                                        CDEBUG(D_NET, "[%d]posting GET  [%d %x %p]->[%x "LPX64"]\n", 
-                                               i,
-                                               tx->tx_wrq[i].scatgat_list->length,
-                                               tx->tx_wrq[i].scatgat_list->l_key,
-                                               tx->tx_wrq[i].scatgat_list->v_address,
-                                               tx->tx_wrq[i].type.send.send_qp_type.rc_type.r_r_key,
-                                               tx->tx_wrq[i].type.send.send_qp_type.rc_type.r_addr);
-                                        break;
-                                default:
-                                        LBUG();
-                                }
-                                vvrc = vv_post_send(kibnal_data.kib_hca,
-                                                    conn->ibc_qp, 
-                                                    &tx->tx_wrq[i], 
-                                                    vv_operation_type_send_rc);
-                                CDEBUG(D_NET, LPX64": post %d/%d\n",
-                                       conn->ibc_peer->ibp_nid, i, tx->tx_nwrq);
-                                if (vvrc != vv_return_ok) {
-                                        rc = -EIO;
-                                        break;
-                                }
-                        }
-#endif
                 }
 
                 if (rc != 0) {
@@ -1074,6 +1032,7 @@ kibnal_tx_complete (kib_tx_t *tx, vv_comp_status_t vvrc)
          * gets to free it, which also drops its ref on 'conn'. */
 
         tx->tx_sending--;
+        conn->ibc_nsends_posted--;
 
         if (failed) {
                 tx->tx_waiting = 0;
@@ -1087,9 +1046,6 @@ kibnal_tx_complete (kib_tx_t *tx, vv_comp_status_t vvrc)
 
         kibnal_conn_addref(conn);               /* 1 ref for me.... */
 
-        if (tx->tx_sending == 0)
-                conn->ibc_nsends_posted--;
-
         spin_unlock(&conn->ibc_lock);
 
         if (idle)
@@ -2724,7 +2680,8 @@ kibnal_arp_callback (ibat_stat_t arprc, ibat_arp_data_t *arp_data, void *arg)
         LASSERT (conn->ibc_state == IBNAL_CONN_ACTIVE_ARP);
 
         conn->ibc_connvars->cv_arprc = arprc;
-        conn->ibc_connvars->cv_arp = *arp_data;
+        if (arprc == ibat_stat_ok)
+                conn->ibc_connvars->cv_arp = *arp_data;
         
         /* connd takes over my ref on conn */
         spin_lock_irqsave(&kibnal_data.kib_connd_lock, flags);