Commit cad88967 authored by Vijay Immanuel's avatar Vijay Immanuel Committed by Greg Kroah-Hartman

IB/rxe: avoid back-to-back retries

[ Upstream commit 4e4c53df ]

Error retries can occur due to timeouts, NAKs or receiving
packets beyond the current read request. Avoid back-to-back
retries due to packet processing, by only retrying the initial
attempt immediately. Subsequent retries must be due to timeouts.

Continue to process completion packets after scheduling a retry.
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>
parent ac0ab821
...@@ -191,6 +191,7 @@ static inline void reset_retry_counters(struct rxe_qp *qp) ...@@ -191,6 +191,7 @@ static inline void reset_retry_counters(struct rxe_qp *qp)
{ {
qp->comp.retry_cnt = qp->attr.retry_cnt; qp->comp.retry_cnt = qp->attr.retry_cnt;
qp->comp.rnr_retry = qp->attr.rnr_retry; qp->comp.rnr_retry = qp->attr.rnr_retry;
qp->comp.started_retry = 0;
} }
static inline enum comp_state check_psn(struct rxe_qp *qp, static inline enum comp_state check_psn(struct rxe_qp *qp,
...@@ -676,6 +677,20 @@ int rxe_completer(void *arg) ...@@ -676,6 +677,20 @@ int rxe_completer(void *arg)
goto exit; goto exit;
} }
/* if we've started a retry, don't start another
* retry sequence, unless this is a timeout.
*/
if (qp->comp.started_retry &&
!qp->comp.timeout_retry) {
if (pkt) {
rxe_drop_ref(pkt->qp);
kfree_skb(skb);
skb = NULL;
}
goto done;
}
if (qp->comp.retry_cnt > 0) { if (qp->comp.retry_cnt > 0) {
if (qp->comp.retry_cnt != 7) if (qp->comp.retry_cnt != 7)
qp->comp.retry_cnt--; qp->comp.retry_cnt--;
...@@ -692,6 +707,7 @@ int rxe_completer(void *arg) ...@@ -692,6 +707,7 @@ int rxe_completer(void *arg)
rxe_counter_inc(rxe, rxe_counter_inc(rxe,
RXE_CNT_COMP_RETRY); RXE_CNT_COMP_RETRY);
qp->req.need_retry = 1; qp->req.need_retry = 1;
qp->comp.started_retry = 1;
rxe_run_task(&qp->req.task, 1); rxe_run_task(&qp->req.task, 1);
} }
...@@ -701,7 +717,7 @@ int rxe_completer(void *arg) ...@@ -701,7 +717,7 @@ int rxe_completer(void *arg)
skb = NULL; skb = NULL;
} }
goto exit; goto done;
} else { } else {
rxe_counter_inc(rxe, RXE_CNT_RETRY_EXCEEDED); rxe_counter_inc(rxe, RXE_CNT_RETRY_EXCEEDED);
......
...@@ -158,6 +158,7 @@ struct rxe_comp_info { ...@@ -158,6 +158,7 @@ struct rxe_comp_info {
int opcode; int opcode;
int timeout; int timeout;
int timeout_retry; int timeout_retry;
int started_retry;
u32 retry_cnt; u32 retry_cnt;
u32 rnr_retry; u32 rnr_retry;
struct rxe_task task; struct rxe_task task;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment