• Vijay Immanuel's avatar
    IB/rxe: fix for duplicate request processing and ack psns · 9dd0fafb
    Vijay Immanuel authored
    [ Upstream commit b97db585 ]
    
    Don't reset the resp opcode for a replayed read response.
    The resp opcode could be in the middle of a write or send
    sequence, when the duplicate read request was received.
    An example sequence is as follows:
    - Receive read request for 12KB PSN 20. Transmit read response
      first, middle and last with PSNs 20,21,22.
    - Receive write first PSN 23.
      At this point the resp psn is 24 and resp opcode is write first.
    - The sender notices that PSN 20 is dropped and retransmits.
      Receive read request for 12KB PSN 20. Transmit read response
      first, middle and last with PSNs 20,21,22. The resp opcode is
      set to -1, the resp psn remains 24.
    - Receive write first PSN 23. This is processed by duplicate_request().
      The resp opcode remains -1 and resp psn remains 24.
    - Receive write middle PSN 24. check_op_seq() reports a missing
      first error since the resp opcode is -1.
    
    When sending an ack for a duplicate send or write request,
    use the psn of the previous ack sent. Do not use the psn
    of a read response for the ack.
    An example sequence is as follows:
    - Receive write PSN 30. Transmit ACK for PSN 30.
    - Receive read request 4KB PSN 31. Transmit read response with
      PSN 31. The resp psn is now 32.
    - The sender notices that PSN 30 is dropped and retransmits.
      Receive write PSN 30. duplicate_request() sends an ACK with
      PSN 31. That is incorrect since PSN 31 was a read request.
    Signed-off-by: default avatarVijay Immanuel <vijayi@attalasystems.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9dd0fafb
rxe_verbs.h 9.49 KB