aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/sw/rxe/rxe_comp.c
diff options
context:
space:
mode:
authorAndrew Boyer <andrew.boyer@dell.com>2016-12-22 08:54:37 -0500
committerDoug Ledford <dledford@redhat.com>2016-12-22 11:36:12 -0500
commitcbf1f9a46c9c5903e34b0b110ca40b1e7d4b2ab1 (patch)
treef335d5a0d47467de7528f2836ef0e62c4029a684 /drivers/infiniband/sw/rxe/rxe_comp.c
parentIB/rxe: Use BTH_PSN_MASK when ACKing duplicate sends (diff)
downloadlinux-dev-cbf1f9a46c9c5903e34b0b110ca40b1e7d4b2ab1.tar.xz
linux-dev-cbf1f9a46c9c5903e34b0b110ca40b1e7d4b2ab1.zip
IB/rxe: Drop future atomic/read packets rather than retrying
If the completer is in the middle of a large read operation, one lost packet can cause havoc. Going to COMPST_ERROR_RETRY will cause the requester to resend the request. After that, any packet from the first attempt still in the receive queue will be interpreted as an error, restarting the error/retry sequence. The transfer will quickly exhaust its retries. This behavior is very noticeable when doing 512KB reads on a QEMU system configured with 1500B MTU. Also, a resent request here will prompt the responder on the other side to immediately start resending, but the resent packets will get stuck in the already-loaded receive queue and will never be processed. Rather than erroring out every time an unexpected future packet arrives, just drop it. Eventually the retry timer will send a duplicate request; the completer will be able to make progress since the queue will start relatively empty. Signed-off-by: Andrew Boyer <andrew.boyer@dell.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to '')
-rw-r--r--drivers/infiniband/sw/rxe/rxe_comp.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c b/drivers/infiniband/sw/rxe/rxe_comp.c
index cd27cbde7652..d369f24425f9 100644
--- a/drivers/infiniband/sw/rxe/rxe_comp.c
+++ b/drivers/infiniband/sw/rxe/rxe_comp.c
@@ -224,7 +224,7 @@ static inline enum comp_state check_psn(struct rxe_qp *qp,
else
return COMPST_DONE;
} else if ((diff > 0) && (wqe->mask & WR_ATOMIC_OR_READ_MASK)) {
- return COMPST_ERROR_RETRY;
+ return COMPST_DONE;
} else {
return COMPST_CHECK_ACK;
}