RDMA/rxe: Fill in wc byte_len with IB_WC_RECV_RDMA_WITH_IMM
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: 8700e3e7c4
("Soft RoCE driver")
Signed-off-by: Konstantin Taranov <konstantin.taranov@inf.ethz.ch>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
96e2fd733b
commit
bdce129049
|
@ -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
|
||||
|
|
|
@ -213,6 +213,7 @@ struct rxe_resp_info {
|
|||
struct rxe_mem *mr;
|
||||
u32 resid;
|
||||
u32 rkey;
|
||||
u32 length;
|
||||
u64 atomic_orig;
|
||||
|
||||
/* SRQ only */
|
||||
|
|
Loading…
Reference in New Issue