lkml.org 
[lkml]   [2019]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.2 131/171] RDMA/rxe: Fill in wc byte_len with IB_WC_RECV_RDMA_WITH_IMM
    Date
    From: Konstantin Taranov <konstantin.taranov@inf.ethz.ch>

    [ Upstream commit bdce1290493caa3f8119f24b5dacc3fb7ca27389 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/sw/rxe/rxe_resp.c | 5 ++++-
    drivers/infiniband/sw/rxe/rxe_verbs.h | 1 +
    2 files changed, 5 insertions(+), 1 deletion(-)

    diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
    index aca9f60f9b21..1cbfbd98eb22 100644
    --- a/drivers/infiniband/sw/rxe/rxe_resp.c
    +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
    @@ -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
    diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
    index e8be7f44e3be..28bfb3ece104 100644
    --- a/drivers/infiniband/sw/rxe/rxe_verbs.h
    +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
    @@ -213,6 +213,7 @@ struct rxe_resp_info {
    struct rxe_mem *mr;
    u32 resid;
    u32 rkey;
    + u32 length;
    u64 atomic_orig;

    /* SRQ only */
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-07-19 06:35    [W:5.728 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site