On Tue, Oct 13, 2020 at 12:07:42PM -0500, Bob Pearson wrote: > The code which limited the number of unacknowledged PSNs was incorrect. > The PSNs are limited to 24 bits and wrap back to zero from 0x00ffffff. > The test was computing a 32 bit value which wraps at 32 bits so that > qp->req.psn can appear smaller than the limit when it is actually larger. > > Replace '>' test with psn_compare which is used for other PSN comparisons > and correctly handles the 24 bit size. > > Fixes: 8700e3e7c485 ("Soft RoCE (RXE) - The software RoCE driver") > Signed-off-by: Bob Pearson <rpearson@xxxxxxx> > --- > drivers/infiniband/sw/rxe/rxe_req.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c > index af3923bf0a36..d4917646641a 100644 > --- a/drivers/infiniband/sw/rxe/rxe_req.c > +++ b/drivers/infiniband/sw/rxe/rxe_req.c > @@ -634,7 +634,8 @@ int rxe_requester(void *arg) > } > > if (unlikely(qp_type(qp) == IB_QPT_RC && > - qp->req.psn > (qp->comp.psn + RXE_MAX_UNACKED_PSNS))) { > + psn_compare(qp->req.psn, (qp->comp.psn + > + RXE_MAX_UNACKED_PSNS)) > 0)) { qp->comp.psn is u32, so you are checking that qp->comp.psn + RXE_MAX_UNACKED_PSNS != 0, am I right? > qp->req.wait_psn = 1; > goto exit; > } > -- > 2.25.1 >