diff mbox series

[v2,for-next,12/17] RDMA/i40iw: Use refcount_t instead of atomic_t on refcount of i40iw_cqp_request

Message ID 1621590825-60693-13-git-send-email-liweihang@huawei.com (mailing list archive)
State Superseded
Headers show
Series RDMA: Use refcount_t for reference counting | expand

Commit Message

Weihang Li May 21, 2021, 9:53 a.m. UTC
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@intel.com>
Cc: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Weihang Li <liweihang@huawei.com>
---
 drivers/infiniband/hw/i40iw/i40iw.h       |  2 +-
 drivers/infiniband/hw/i40iw/i40iw_main.c  |  2 +-
 drivers/infiniband/hw/i40iw/i40iw_utils.c | 10 +++++-----
 3 files changed, 7 insertions(+), 7 deletions(-)

Comments

Zhu Yanjun May 22, 2021, 9:41 a.m. UTC | #1
On Fri, May 21, 2021 at 7:35 PM Weihang Li <liweihang@huawei.com> 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@intel.com>
> Cc: Shiraz Saleem <shiraz.saleem@intel.com>
> Signed-off-by: Weihang Li <liweihang@huawei.com>
> ---
>  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@intel.com/

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
>
Weihang Li May 24, 2021, 1:50 a.m. UTC | #2
On 2021/5/22 17:42, Zhu Yanjun wrote:
> On Fri, May 21, 2021 at 7:35 PM Weihang Li <liweihang@huawei.com> 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@intel.com>
>> Cc: Shiraz Saleem <shiraz.saleem@intel.com>
>> Signed-off-by: Weihang Li <liweihang@huawei.com>
>> ---
>>  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@intel.com/
> 
> In this commit, i40iw will be removed. And this commit will be merged
> into upstream linux.
> Not sure if this commit makes sense.
> 

I see, changes on i40iw will be dropped from this series, thanks.

Weihang

>>  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
>>
>
diff mbox series

Patch

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