> -----Original Message----- > From: Guoqing Jiang <guoqing.jiang@xxxxxxxxx> > Sent: Monday, October 9, 2023 9:18 AM > To: Bernard Metzler <BMT@xxxxxxxxxxxxxx>; jgg@xxxxxxxx; leon@xxxxxxxxxx > Cc: linux-rdma@xxxxxxxxxxxxxxx > Subject: [EXTERNAL] [PATCH 12/19] RDMA/siw: Introduce siw_free_cm_id > > Factor out a helper to simplify code. > > Signed-off-by: Guoqing Jiang <guoqing.jiang@xxxxxxxxx> > --- > drivers/infiniband/sw/siw/siw_cm.c | 36 +++++++++++++----------------- > 1 file changed, 16 insertions(+), 20 deletions(-) > > diff --git a/drivers/infiniband/sw/siw/siw_cm.c > b/drivers/infiniband/sw/siw/siw_cm.c > index 2f338bb3a24c..987084828786 100644 > --- a/drivers/infiniband/sw/siw/siw_cm.c > +++ b/drivers/infiniband/sw/siw/siw_cm.c > @@ -364,6 +364,17 @@ static int siw_cm_upcall(struct siw_cep *cep, enum > iw_cm_event_type reason, > return id->event_handler(id, &event); > } > > +void siw_free_cm_id(struct siw_cep *cep, bool put_cep) > +{ > + if (!cep->cm_id) > + return; > + > + cep->cm_id->rem_ref(cep->cm_id); > + cep->cm_id = NULL; I suggest not including cep_put() here, but to keep cep reference counting explicit in the code. > + if (put_cep) > + siw_cep_put(cep); > +} > + > /* > * siw_qp_cm_drop() > * > @@ -415,9 +426,7 @@ void siw_qp_cm_drop(struct siw_qp *qp, int schedule) > default: > break; > } > - cep->cm_id->rem_ref(cep->cm_id); > - cep->cm_id = NULL; > - siw_cep_put(cep); > + siw_free_cm_id(cep, true); > } > cep->state = SIW_EPSTATE_CLOSED; > > @@ -1175,11 +1184,7 @@ static void siw_cm_work_handler(struct work_struct > *w) > sock_release(cep->sock); > cep->sock = NULL; > } > - if (cep->cm_id) { > - cep->cm_id->rem_ref(cep->cm_id); > - cep->cm_id = NULL; > - siw_cep_put(cep); > - } > + siw_free_cm_id(cep, true); > } > siw_cep_set_free(cep); > siw_put_work(work); > @@ -1702,10 +1707,7 @@ int siw_accept(struct iw_cm_id *id, struct > iw_cm_conn_param *params) > > cep->state = SIW_EPSTATE_CLOSED; > > - if (cep->cm_id) { > - cep->cm_id->rem_ref(id); > - cep->cm_id = NULL; > - } > + siw_free_cm_id(cep, false); > if (qp->cep) { > siw_cep_put(cep); > qp->cep = NULL; > @@ -1880,10 +1882,7 @@ int siw_create_listen(struct iw_cm_id *id, int > backlog) > if (cep) { > siw_cep_set_inuse(cep); > > - if (cep->cm_id) { > - cep->cm_id->rem_ref(cep->cm_id); > - cep->cm_id = NULL; > - } > + siw_free_cm_id(cep, false); > cep->sock = NULL; > siw_socket_disassoc(s); > cep->state = SIW_EPSTATE_CLOSED; > @@ -1912,10 +1911,7 @@ static void siw_drop_listeners(struct iw_cm_id *id) > > siw_cep_set_inuse(cep); > > - if (cep->cm_id) { > - cep->cm_id->rem_ref(cep->cm_id); > - cep->cm_id = NULL; > - } > + siw_free_cm_id(cep, false); > if (cep->sock) { > siw_socket_disassoc(cep->sock); > sock_release(cep->sock); > -- > 2.35.3