RDMA/rxe: Fill in wc byte_len with IB_WC_RECV_RDMA_WITH_IMM
authorKonstantin Taranov <konstantin.taranov@inf.ethz.ch>
Thu, 27 Jun 2019 14:06:43 +0000 (16:06 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 8 Jul 2019 19:40:15 +0000 (16:40 -0300)
Calculate the correct byte_len on the receiving side when a work
completion is generated with IB_WC_RECV_RDMA_WITH_IMM opcode.

According to the IBA byte_len must indicate the number of written bytes,
whereas it was always equal to zero for the IB_WC_RECV_RDMA_WITH_IMM
opcode, even though data was transferred.

Fixes: 8700e3e7c485 ("Soft RoCE driver")
Signed-off-by: Konstantin Taranov <konstantin.taranov@inf.ethz.ch>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/sw/rxe/rxe_resp.c
drivers/infiniband/sw/rxe/rxe_verbs.h

index aca9f60..1cbfbd9 100644 (file)
@@ -431,6 +431,7 @@ static enum resp_states check_rkey(struct rxe_qp *qp,
                        qp->resp.va = reth_va(pkt);
                        qp->resp.rkey = reth_rkey(pkt);
                        qp->resp.resid = reth_len(pkt);
+                       qp->resp.length = reth_len(pkt);
                }
                access = (pkt->mask & RXE_READ_MASK) ? IB_ACCESS_REMOTE_READ
                                                     : IB_ACCESS_REMOTE_WRITE;
@@ -856,7 +857,9 @@ static enum resp_states do_complete(struct rxe_qp *qp,
                                pkt->mask & RXE_WRITE_MASK) ?
                                        IB_WC_RECV_RDMA_WITH_IMM : IB_WC_RECV;
                wc->vendor_err = 0;
-               wc->byte_len = wqe->dma.length - wqe->dma.resid;
+               wc->byte_len = (pkt->mask & RXE_IMMDT_MASK &&
+                               pkt->mask & RXE_WRITE_MASK) ?
+                                       qp->resp.length : wqe->dma.length - wqe->dma.resid;
 
                /* fields after byte_len are different between kernel and user
                 * space
index 6c997d3..5c4b223 100644 (file)
@@ -213,6 +213,7 @@ struct rxe_resp_info {
        struct rxe_mem          *mr;
        u32                     resid;
        u32                     rkey;
+       u32                     length;
        u64                     atomic_orig;
 
        /* SRQ only */