Re: [PATCH] rxe: fix error completion wr_id and qp_num

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2018-11-06 at 16:24 -0500, Doug Ledford wrote:
> On Mon, 2018-10-29 at 10:16 +0200, Sasha Kotchubievsky wrote:
> > I think, wr_id and status should be valid in existing implementation.
> > struct rxe_cqe {
> >         union {
> >                 struct ib_wc            ibwc;
> >                 struct ib_uverbs_wc     uibwc;
> >         };
> > };
> > In both cases wr_id and status are in the same places
> > So lines
> > wc->wr_id		= wqe->wr_id;
> 
> The original bug report clearly called out wr_id as being invalid in
> their specific scenario.

I thought it was, but only qp_num was actually invalid. My interpretation of
wr_id was dependent on an earlier use of qp_num and I didn't realize that was
the fundamental problem.

> 
> > wc->status		= qp->resp.status
> > set the valid values for rxe too.
> > 
> > But I agree, that at the first glance, the code looks invalid and some
> > refactoring can be done.
> 
> Personally, I like Sagi's patch.  It's clear and unambiguous and you
> don't need to understand that there is a union in play making things
> work.  And the original code obviously got the qp setting for user space
> wrong, period.  You can argue that it doesn't need to provide the qpnum
> to user space, but the original code set it to the internal qp address
> for both user and kernel space and needs to be fixed.

The man page for ibv_poll_cq says qp_num should be valid. I understand the verbs
specification may indicate otherwise, but given what the man page says and how
easy it is to make qp_num valid, I am very glad to see that this is the approach
being taken. That said, I've since reworked my code to avoid needing the qp_num
on the error path and everything is working both with and without this patch.

Thanks for the help everyone.

> 
> I'm inclined to take the patch, especially since it has verified test
> results to go along with it.  So, applied to for-next, please post any
> fixups as incremental patches.
> 
> > Regards
> > Sasha
> > 
> > On 25/10/2018 22:40, Sagi Grimberg wrote:
> > > Error completions must still contain a valid wr_id and
> > > qp_num such that the consumer can rely on. Correctly
> > > fill these fields in receive error completions.
> > > 
> > > Reported-by: Walker Benjamin <benjamin.walker@xxxxxxxxx>
> > > Cc: stable@xxxxxxxxxxxxxxx
> > > Signed-off-by: Sagi Grimberg <sagi@xxxxxxxxxxx>
> > > ---
> > >  drivers/infiniband/sw/rxe/rxe_resp.c | 13 +++++++++----
> > >  1 file changed, 9 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c
> > > b/drivers/infiniband/sw/rxe/rxe_resp.c
> > > index aa5833318372..3438f0653df0 100644
> > > --- a/drivers/infiniband/sw/rxe/rxe_resp.c
> > > +++ b/drivers/infiniband/sw/rxe/rxe_resp.c
> > > @@ -841,11 +841,16 @@ static enum resp_states do_complete(struct rxe_qp
> > > *qp,
> > >  
> > >  	memset(&cqe, 0, sizeof(cqe));
> > >  
> > > -	wc->wr_id		= wqe->wr_id;
> > > -	wc->status		= qp->resp.status;
> > > -	wc->qp			= &qp->ibqp;
> > > +	if (qp->rcq->is_user) {
> > > +		uwc->status             = qp->resp.status;
> > > +		uwc->qp_num             = qp->ibqp.qp_num;
> > > +		uwc->wr_id              = wqe->wr_id;
> > > +	} else {
> > > +		wc->status              = qp->resp.status;
> > > +		wc->qp                  = &qp->ibqp;
> > > +		wc->wr_id               = wqe->wr_id;
> > > +	}
> > >  
> > > -	/* fields after status are not required for errors */
> > >  	if (wc->status == IB_WC_SUCCESS) {
> > >  		wc->opcode = (pkt->mask & RXE_IMMDT_MASK &&
> > >  				pkt->mask & RXE_WRITE_MASK) ?
> > > 
> 
> 





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux