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

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

 



Hi,

I just checked IB sepc. It looks like, IB spec in relevant chapter
(11.4.2) doesn't have any requirement for qp_num to be valid in case of
error. Only wr_id and status must be valid.

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;
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.

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