Re: [PATCH RESEND for-next 5/9] IB/{rdmavt, qib, hfi1}: Use new routine to release reference counts

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

 



On Fri, Apr 12, 2019 at 06:41:42AM -0700, Dennis Dalessandro wrote:
> From: Mike Marciniszyn <mike.marciniszyn@xxxxxxxxx>
>
> The reference count adjustments on reference count completion
> are open coded throughout.
>
> Add a routine to do all reference count adjustments and use.
>
> Reviewed-by: Michael J. Ruhl <michael.j.ruhl@xxxxxxxxx>
> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@xxxxxxxxx>
> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxx>
>
> ---
> For some reason patch didn't make the list or patchworks. This
> is just a re-send. All the rest seem to have made it.
> ---
>  drivers/infiniband/hw/hfi1/rc.c    |    4 ++--
>  drivers/infiniband/hw/qib/qib_rc.c |    4 ++--
>  drivers/infiniband/sw/rdmavt/qp.c  |    9 ++-------
>  include/rdma/rdmavt_qp.h           |   14 ++++++++++++++
>  4 files changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
> index 5ba39a9..a922edc 100644
> --- a/drivers/infiniband/hw/hfi1/rc.c
> +++ b/drivers/infiniband/hw/hfi1/rc.c
> @@ -1834,7 +1834,7 @@ void hfi1_rc_send_complete(struct rvt_qp *qp, struct hfi1_opa_header *opah)
>  		qp->s_last = s_last;
>  		/* see post_send() */
>  		barrier();
> -		rvt_put_swqe(wqe);
> +		rvt_put_qp_swqe(qp, wqe);
>  		rvt_qp_swqe_complete(qp,
>  				     wqe,
>  				     ib_hfi1_wc_opcode[wqe->wr.opcode],
> @@ -1882,7 +1882,7 @@ struct rvt_swqe *do_rc_completion(struct rvt_qp *qp,
>  		u32 s_last;
>
>  		trdma_clean_swqe(qp, wqe);
> -		rvt_put_swqe(wqe);
> +		rvt_put_qp_swqe(qp, wqe);
>  		rvt_qp_wqe_unreserve(qp, wqe);
>  		s_last = qp->s_last;
>  		trace_hfi1_qp_send_completion(qp, wqe, s_last);
> diff --git a/drivers/infiniband/hw/qib/qib_rc.c b/drivers/infiniband/hw/qib/qib_rc.c
> index 50dd981..2ac4c67 100644
> --- a/drivers/infiniband/hw/qib/qib_rc.c
> +++ b/drivers/infiniband/hw/qib/qib_rc.c
> @@ -933,7 +933,7 @@ void qib_rc_send_complete(struct rvt_qp *qp, struct ib_header *hdr)
>  		qp->s_last = s_last;
>  		/* see post_send() */
>  		barrier();
> -		rvt_put_swqe(wqe);
> +		rvt_put_qp_swqe(qp, wqe);
>  		rvt_qp_swqe_complete(qp,
>  				     wqe,
>  				     ib_qib_wc_opcode[wqe->wr.opcode],
> @@ -975,7 +975,7 @@ static inline void update_last_psn(struct rvt_qp *qp, u32 psn)
>  	    qib_cmp24(qp->s_sending_psn, qp->s_sending_hpsn) > 0) {
>  		u32 s_last;
>
> -		rvt_put_swqe(wqe);
> +		rvt_put_qp_swqe(qp, wqe);
>  		s_last = qp->s_last;
>  		if (++s_last >= qp->s_size)
>  			s_last = 0;
> diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c
> index 2460303..31a2e65 100644
> --- a/drivers/infiniband/sw/rdmavt/qp.c
> +++ b/drivers/infiniband/sw/rdmavt/qp.c
> @@ -623,10 +623,7 @@ static void rvt_clear_mr_refs(struct rvt_qp *qp, int clr_sends)
>  		while (qp->s_last != qp->s_head) {
>  			struct rvt_swqe *wqe = rvt_get_swqe_ptr(qp, qp->s_last);
>
> -			rvt_put_swqe(wqe);
> -			if (qp->allowed_ops == IB_OPCODE_UD)
> -				atomic_dec(&ibah_to_rvtah(
> -						wqe->ud_wr.ah)->refcount);
> +			rvt_put_qp_swqe(qp, wqe);
>  			if (++qp->s_last >= qp->s_size)
>  				qp->s_last = 0;
>  			smp_wmb(); /* see qp_set_savail */
> @@ -2683,9 +2680,7 @@ void rvt_send_complete(struct rvt_qp *qp, struct rvt_swqe *wqe,
>  	qp->s_last = last;
>  	/* See post_send() */
>  	barrier();
> -	rvt_put_swqe(wqe);
> -	if (qp->allowed_ops == IB_OPCODE_UD)
> -		atomic_dec(&ibah_to_rvtah(wqe->ud_wr.ah)->refcount);
> +	rvt_put_qp_swqe(qp, wqe);
>
>  	rvt_qp_swqe_complete(qp,
>  			     wqe,
> diff --git a/include/rdma/rdmavt_qp.h b/include/rdma/rdmavt_qp.h
> index a00c46a..68e38c2 100644
> --- a/include/rdma/rdmavt_qp.h
> +++ b/include/rdma/rdmavt_qp.h
> @@ -723,6 +723,20 @@ static inline void rvt_mod_retry_timer(struct rvt_qp *qp)
>  	return rvt_mod_retry_timer_ext(qp, 0);
>  }
>
> +/**
> + * rvt_put_qp_swqe - drop refs held by swqe
> + * @qp: the send qp
> + * @wqe: the send wqe
> + *
> + * This drops any references held by the swqe
> + */
> +static inline void rvt_put_qp_swqe(struct rvt_qp *qp, struct rvt_swqe *wqe)
> +{
> +	rvt_put_swqe(wqe);
> +	if (qp->allowed_ops == IB_OPCODE_UD)
> +		atomic_dec(&ibah_to_rvtah(wqe->ud_wr.ah)->refcount);
> +}

In the context of my allocation change patches, I wanted to ask on which
objects should driver perform refcounting?

Thanks

> +
>  extern const int  ib_rvt_state_ops[];
>
>  struct rvt_dev_info;
>

Attachment: signature.asc
Description: PGP signature


[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