| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: David Marchand <david.marchand@6wind.com> |
| Date: Fri, 24 Feb 2017 15:38:26 +0100 |
| Subject: IB/rxe: increment msn only when completing a request |
| |
| From: David Marchand <david.marchand@6wind.com> |
| |
| |
| [ Upstream commit 9fcd67d1772c43d2f23e8fca56acc7219e991676 ] |
| |
| According to C9-147, MSN should only be incremented when the last packet of |
| a multi packet request has been received. |
| |
| "Logically, the requester associates a sequential Send Sequence Number |
| (SSN) with each WQE posted to the send queue. The SSN bears a one- |
| to-one relationship to the MSN returned by the responder in each re- |
| sponse packet. Therefore, when the requester receives a response, it in- |
| terprets the MSN as representing the SSN of the most recent request |
| completed by the responder to determine which send WQE(s) can be |
| completed." |
| |
| Fixes: 8700e3e7c485 ("Soft RoCE driver") |
| |
| Signed-off-by: David Marchand <david.marchand@6wind.com> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/infiniband/sw/rxe/rxe_resp.c | 9 ++++----- |
| 1 file changed, 4 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/infiniband/sw/rxe/rxe_resp.c |
| +++ b/drivers/infiniband/sw/rxe/rxe_resp.c |
| @@ -799,18 +799,17 @@ static enum resp_states execute(struct r |
| /* Unreachable */ |
| WARN_ON(1); |
| |
| - /* We successfully processed this new request. */ |
| - qp->resp.msn++; |
| - |
| /* next expected psn, read handles this separately */ |
| qp->resp.psn = (pkt->psn + 1) & BTH_PSN_MASK; |
| |
| qp->resp.opcode = pkt->opcode; |
| qp->resp.status = IB_WC_SUCCESS; |
| |
| - if (pkt->mask & RXE_COMP_MASK) |
| + if (pkt->mask & RXE_COMP_MASK) { |
| + /* We successfully processed this new request. */ |
| + qp->resp.msn++; |
| return RESPST_COMPLETE; |
| - else if (qp_type(qp) == IB_QPT_RC) |
| + } else if (qp_type(qp) == IB_QPT_RC) |
| return RESPST_ACKNOWLEDGE; |
| else |
| return RESPST_CLEANUP; |