On Fri, May 21, 2021 at 7:35 PM Weihang Li <liweihang@xxxxxxxxxx> wrote: > > The refcount_t API will WARN on underflow and overflow of a reference > counter, and avoid use-after-free risks. > > Cc: Faisal Latif <faisal.latif@xxxxxxxxx> > Cc: Shiraz Saleem <shiraz.saleem@xxxxxxxxx> > Signed-off-by: Weihang Li <liweihang@xxxxxxxxxx> > --- > drivers/infiniband/hw/i40iw/i40iw.h | 2 +- > drivers/infiniband/hw/i40iw/i40iw_main.c | 2 +- > drivers/infiniband/hw/i40iw/i40iw_utils.c | 10 +++++----- https://patchwork.kernel.org/project/linux-rdma/patch/20210520143809.819-22-shiraz.saleem@xxxxxxxxx/ In this commit, i40iw will be removed. And this commit will be merged into upstream linux. Not sure if this commit makes sense. > 3 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h > index be4094a..15c5dd6 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw.h > +++ b/drivers/infiniband/hw/i40iw/i40iw.h > @@ -137,7 +137,7 @@ struct i40iw_cqp_request { > struct cqp_commands_info info; > wait_queue_head_t waitq; > struct list_head list; > - atomic_t refcount; > + refcount_t refcount; > void (*callback_fcn)(struct i40iw_cqp_request*, u32); > void *param; > struct i40iw_cqp_compl_info compl_info; > diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c > index b496f30..fc48555 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_main.c > +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c > @@ -1125,7 +1125,7 @@ static enum i40iw_status_code i40iw_alloc_local_mac_ipaddr_entry(struct i40iw_de > } > > /* increment refcount, because we need the cqp request ret value */ > - atomic_inc(&cqp_request->refcount); > + refcount_inc(&cqp_request->refcount); > > cqp_info = &cqp_request->info; > cqp_info->cqp_cmd = OP_ALLOC_LOCAL_MAC_IPADDR_ENTRY; > diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c > index 9ff825f..32ff432b 100644 > --- a/drivers/infiniband/hw/i40iw/i40iw_utils.c > +++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c > @@ -384,10 +384,10 @@ struct i40iw_cqp_request *i40iw_get_cqp_request(struct i40iw_cqp *cqp, bool wait > } > > if (wait) { > - atomic_set(&cqp_request->refcount, 2); > + refcount_set(&cqp_request->refcount, 2); > cqp_request->waiting = true; > } else { > - atomic_set(&cqp_request->refcount, 1); > + refcount_set(&cqp_request->refcount, 1); > } > return cqp_request; > } > @@ -424,7 +424,7 @@ void i40iw_free_cqp_request(struct i40iw_cqp *cqp, struct i40iw_cqp_request *cqp > void i40iw_put_cqp_request(struct i40iw_cqp *cqp, > struct i40iw_cqp_request *cqp_request) > { > - if (atomic_dec_and_test(&cqp_request->refcount)) > + if (refcount_dec_and_test(&cqp_request->refcount)) > i40iw_free_cqp_request(cqp, cqp_request); > } > > @@ -445,7 +445,7 @@ static void i40iw_free_pending_cqp_request(struct i40iw_cqp *cqp, > } > i40iw_put_cqp_request(cqp, cqp_request); > wait_event_timeout(iwdev->close_wq, > - !atomic_read(&cqp_request->refcount), > + !refcount_read(&cqp_request->refcount), > 1000); > } > > @@ -1005,7 +1005,7 @@ static void i40iw_cqp_manage_hmc_fcn_callback(struct i40iw_cqp_request *cqp_requ > > if (hmcfcninfo && hmcfcninfo->callback_fcn) { > i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_HMC, "%s1\n", __func__); > - atomic_inc(&cqp_request->refcount); > + refcount_inc(&cqp_request->refcount); > work = &iwdev->virtchnl_w[hmcfcninfo->iw_vf_idx]; > work->cqp_request = cqp_request; > INIT_WORK(&work->work, i40iw_cqp_manage_hmc_fcn_worker); > -- > 2.7.4 >