• Vijay Immanuel's avatar
    IB/rxe: fixes for rdma read retry · 030e46e4
    Vijay Immanuel authored
    When a read request is retried for the remaining partial
    data, the response may restart from read response first
    or read response only. So support those cases.
    
    Do not advance the comp psn beyond the current wqe's last_psn
    as that could skip over an entire read wqe and will cause the
    req_retry() logic to set an incorrect req psn.
    An example sequence is as follows:
    Write        PSN 40 -- this is the current WQE.
    Read request PSN 41
    Write        PSN 42
    Receive ACK  PSN 42 -- this will complete the current WQE
    for PSN 40, and set the comp psn to 42 which is a problem
    because the read request at PSN 41 has been skipped over.
    So when req_retry() tries to retransmit the read request,
    it sets the req psn to 42 which is incorrect.
    
    When retrying a read request, calculate the number of psns
    completed based on the dma resid instead of the wqe first_psn.
    The wqe first_psn could have moved if the read request was
    retried multiple times.
    
    Set the reth length to the dma resid to handle read retries for
    the remaining partial data.
    Signed-off-by: default avatarVijay Immanuel <vijayi@attalasystems.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    030e46e4
rxe_req.c 18.8 KB