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