]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/infiniband/hw/hfi1/rc.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
[karo-tx-linux.git] / drivers / infiniband / hw / hfi1 / rc.c
index 83198a8a87979baeeb58c591fba0e4d06db6e014..809b26eb6d3cbba22fe902051a42986a012cf35d 100644 (file)
@@ -276,7 +276,7 @@ static int make_rc_ack(struct hfi1_ibdev *dev, struct rvt_qp *qp,
                                rvt_get_mr(ps->s_txreq->mr);
                        qp->s_ack_rdma_sge.sge = e->rdma_sge;
                        qp->s_ack_rdma_sge.num_sge = 1;
-                       qp->s_cur_sge = &qp->s_ack_rdma_sge;
+                       ps->s_txreq->ss = &qp->s_ack_rdma_sge;
                        if (len > pmtu) {
                                len = pmtu;
                                qp->s_ack_state = OP(RDMA_READ_RESPONSE_FIRST);
@@ -290,7 +290,7 @@ static int make_rc_ack(struct hfi1_ibdev *dev, struct rvt_qp *qp,
                        bth2 = mask_psn(qp->s_ack_rdma_psn++);
                } else {
                        /* COMPARE_SWAP or FETCH_ADD */
-                       qp->s_cur_sge = NULL;
+                       ps->s_txreq->ss = NULL;
                        len = 0;
                        qp->s_ack_state = OP(ATOMIC_ACKNOWLEDGE);
                        ohdr->u.at.aeth = hfi1_compute_aeth(qp);
@@ -306,7 +306,7 @@ static int make_rc_ack(struct hfi1_ibdev *dev, struct rvt_qp *qp,
                qp->s_ack_state = OP(RDMA_READ_RESPONSE_MIDDLE);
                /* FALLTHROUGH */
        case OP(RDMA_READ_RESPONSE_MIDDLE):
-               qp->s_cur_sge = &qp->s_ack_rdma_sge;
+               ps->s_txreq->ss = &qp->s_ack_rdma_sge;
                ps->s_txreq->mr = qp->s_ack_rdma_sge.sge.mr;
                if (ps->s_txreq->mr)
                        rvt_get_mr(ps->s_txreq->mr);
@@ -335,7 +335,7 @@ normal:
                 */
                qp->s_ack_state = OP(SEND_ONLY);
                qp->s_flags &= ~RVT_S_ACK_PENDING;
-               qp->s_cur_sge = NULL;
+               ps->s_txreq->ss = NULL;
                if (qp->s_nak_state)
                        ohdr->u.aeth =
                                cpu_to_be32((qp->r_msn & HFI1_MSN_MASK) |
@@ -351,7 +351,7 @@ normal:
        qp->s_rdma_ack_cnt++;
        qp->s_hdrwords = hwords;
        ps->s_txreq->sde = priv->s_sde;
-       qp->s_cur_size = len;
+       ps->s_txreq->s_cur_size = len;
        hfi1_make_ruc_header(qp, ohdr, bth0, bth2, middle, ps);
        /* pbc */
        ps->s_txreq->hdr_dwords = qp->s_hdrwords + 2;
@@ -801,8 +801,8 @@ int hfi1_make_rc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
        qp->s_len -= len;
        qp->s_hdrwords = hwords;
        ps->s_txreq->sde = priv->s_sde;
-       qp->s_cur_sge = ss;
-       qp->s_cur_size = len;
+       ps->s_txreq->ss = ss;
+       ps->s_txreq->s_cur_size = len;
        hfi1_make_ruc_header(
                qp,
                ohdr,
@@ -1146,8 +1146,6 @@ void hfi1_rc_send_complete(struct rvt_qp *qp, struct ib_header *hdr)
 {
        struct ib_other_headers *ohdr;
        struct rvt_swqe *wqe;
-       struct ib_wc wc;
-       unsigned i;
        u32 opcode;
        u32 psn;
 
@@ -1195,22 +1193,8 @@ void hfi1_rc_send_complete(struct rvt_qp *qp, struct ib_header *hdr)
                qp->s_last = s_last;
                /* see post_send() */
                barrier();
-               for (i = 0; i < wqe->wr.num_sge; i++) {
-                       struct rvt_sge *sge = &wqe->sg_list[i];
-
-                       rvt_put_mr(sge->mr);
-               }
-               /* Post a send completion queue entry if requested. */
-               if (!(qp->s_flags & RVT_S_SIGNAL_REQ_WR) ||
-                   (wqe->wr.send_flags & IB_SEND_SIGNALED)) {
-                       memset(&wc, 0, sizeof(wc));
-                       wc.wr_id = wqe->wr.wr_id;
-                       wc.status = IB_WC_SUCCESS;
-                       wc.opcode = ib_hfi1_wc_opcode[wqe->wr.opcode];
-                       wc.byte_len = wqe->length;
-                       wc.qp = &qp->ibqp;
-                       rvt_cq_enter(ibcq_to_rvtcq(qp->ibqp.send_cq), &wc, 0);
-               }
+               rvt_put_swqe(wqe);
+               rvt_qp_swqe_complete(qp, wqe, IB_WC_SUCCESS);
        }
        /*
         * If we were waiting for sends to complete before re-sending,
@@ -1240,9 +1224,6 @@ static struct rvt_swqe *do_rc_completion(struct rvt_qp *qp,
                                         struct rvt_swqe *wqe,
                                         struct hfi1_ibport *ibp)
 {
-       struct ib_wc wc;
-       unsigned i;
-
        lockdep_assert_held(&qp->s_lock);
        /*
         * Don't decrement refcount and don't generate a
@@ -1253,28 +1234,14 @@ static struct rvt_swqe *do_rc_completion(struct rvt_qp *qp,
            cmp_psn(qp->s_sending_psn, qp->s_sending_hpsn) > 0) {
                u32 s_last;
 
-               for (i = 0; i < wqe->wr.num_sge; i++) {
-                       struct rvt_sge *sge = &wqe->sg_list[i];
-
-                       rvt_put_mr(sge->mr);
-               }
+               rvt_put_swqe(wqe);
                s_last = qp->s_last;
                if (++s_last >= qp->s_size)
                        s_last = 0;
                qp->s_last = s_last;
                /* see post_send() */
                barrier();
-               /* Post a send completion queue entry if requested. */
-               if (!(qp->s_flags & RVT_S_SIGNAL_REQ_WR) ||
-                   (wqe->wr.send_flags & IB_SEND_SIGNALED)) {
-                       memset(&wc, 0, sizeof(wc));
-                       wc.wr_id = wqe->wr.wr_id;
-                       wc.status = IB_WC_SUCCESS;
-                       wc.opcode = ib_hfi1_wc_opcode[wqe->wr.opcode];
-                       wc.byte_len = wqe->length;
-                       wc.qp = &qp->ibqp;
-                       rvt_cq_enter(ibcq_to_rvtcq(qp->ibqp.send_cq), &wc, 0);
-               }
+               rvt_qp_swqe_complete(qp, wqe, IB_WC_SUCCESS);
        } else {
                struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
 
@@ -2295,7 +2262,7 @@ send_last:
                hfi1_copy_sge(&qp->r_sge, data, tlen, 1, copy_last);
                rvt_put_ss(&qp->r_sge);
                qp->r_msn++;
-               if (!test_and_clear_bit(RVT_R_WRID_VALID, &qp->r_aflags))
+               if (!__test_and_clear_bit(RVT_R_WRID_VALID, &qp->r_aflags))
                        break;
                wc.wr_id = qp->r_wr_id;
                wc.status = IB_WC_SUCCESS;
@@ -2410,8 +2377,7 @@ send_last:
                         * Update the next expected PSN.  We add 1 later
                         * below, so only add the remainder here.
                         */
-                       if (len > pmtu)
-                               qp->r_psn += (len - 1) / pmtu;
+                       qp->r_psn += rvt_div_mtu(qp, len - 1);
                } else {
                        e->rdma_sge.mr = NULL;
                        e->rdma_sge.vaddr = NULL;