RDMA/rxe: Fix incomplete state save in rxe_requester
authorBob Pearson <rpearsonhpe@gmail.com>
Fri, 21 Jul 2023 20:07:49 +0000 (15:07 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 31 Jul 2023 18:24:12 +0000 (15:24 -0300)
commit5d122db2ff80cd2aed4dcd630befb56b51ddf947
treeaa9c8d8f29b3bb64ad46b6350d9acd11b20144e1
parentcc28f351155def8db209647f2e20a59a7080825b
RDMA/rxe: Fix incomplete state save in rxe_requester

If a send packet is dropped by the IP layer in rxe_requester()
the call to rxe_xmit_packet() can fail with err == -EAGAIN.
To recover, the state of the wqe is restored to the state before
the packet was sent so it can be resent. However, the routines
that save and restore the state miss a significnt part of the
variable state in the wqe, the dma struct which is used to process
through the sge table. And, the state is not saved before the packet
is built which modifies the dma struct.

Under heavy stress testing with many QPs on a fast node sending
large messages to a slow node dropped packets are observed and
the resent packets are corrupted because the dma struct was not
restored. This patch fixes this behavior and allows the test cases
to succeed.

Fixes: 3050b9985024 ("IB/rxe: Fix race condition between requester and completer")
Link: https://lore.kernel.org/r/20230721200748.4604-1-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_req.c