From: Weihang Li <hidden> Date: 2021-05-28 09:38:02
There are some refcnt in type of atomic_t in RDMA subsystem, almost all of
them is wrote before the refcount_t is acheived in kernel. refcount_t is
better than integer for reference counting, it will WARN on
overflow/underflow and avoid use-after-free risks.
Changes since v3:
* Drop the rdmavt patch because the refcount_t is not suitable for the
logic.
* Link: https://patchwork.kernel.org/project/linux-rdma/cover/1621925504-33019-1-git-send-email-liweihang@huawei.com/
Changes since v2:
* Drop i40iw related parts because this driver will be removed soon.
* Link: https://patchwork.kernel.org/project/linux-rdma/cover/1621590825-60693-1-git-send-email-liweihang@huawei.com/
Changes since v1:
* Split these patches by variable granularity.
* Fix a warning on refcount of struct mcast_group.
* Add a patch on rdmavt.
* Drop "RDMA/hns: Use refcount_t APIs for HEM".
* Link: https://patchwork.kernel.org/project/linux-rdma/cover/1620958299-4869-1-git-send-email-liweihang@huawei.com/
Weihang Li (12):
RDMA/core: Use refcount_t instead of atomic_t on refcount of
iwcm_id_private
RDMA/core: Use refcount_t instead of atomic_t on refcount of
iwpm_admin_data
RDMA/core: Use refcount_t instead of atomic_t on refcount of
ib_mad_snoop_private
RDMA/core: Use refcount_t instead of atomic_t on refcount of
mcast_member
RDMA/core: Use refcount_t instead of atomic_t on refcount of
mcast_port
RDMA/core: Use refcount_t instead of atomic_t on refcount of
mcast_group
RDMA/core: Use refcount_t instead of atomic_t on refcount of
ib_uverbs_device
RDMA/hns: Use refcount_t instead of atomic_t for CQ reference counting
RDMA/hns: Use refcount_t instead of atomic_t for SRQ reference
counting
RDMA/hns: Use refcount_t instead of atomic_t for QP reference counting
RDMA/cxgb4: Use refcount_t instead of atomic_t for reference counting
RDMA/ipoib: Use refcount_t instead of atomic_t for reference counting
drivers/infiniband/core/iwcm.c | 9 ++++---
drivers/infiniband/core/iwcm.h | 2 +-
drivers/infiniband/core/iwpm_util.c | 12 ++++++----
drivers/infiniband/core/iwpm_util.h | 2 +-
drivers/infiniband/core/mad_priv.h | 2 +-
drivers/infiniband/core/multicast.c | 37 ++++++++++++++++-------------
drivers/infiniband/core/uverbs.h | 2 +-
drivers/infiniband/core/uverbs_main.c | 12 +++++-----
drivers/infiniband/hw/cxgb4/cq.c | 6 ++---
drivers/infiniband/hw/cxgb4/ev.c | 8 +++----
drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 2 +-
drivers/infiniband/hw/hns/hns_roce_cq.c | 8 +++----
drivers/infiniband/hw/hns/hns_roce_device.h | 6 ++---
drivers/infiniband/hw/hns/hns_roce_qp.c | 12 +++++-----
drivers/infiniband/hw/hns/hns_roce_srq.c | 8 +++----
drivers/infiniband/ulp/ipoib/ipoib.h | 4 ++--
drivers/infiniband/ulp/ipoib/ipoib_main.c | 8 +++----
17 files changed, 74 insertions(+), 66 deletions(-)
--
2.7.4
From: Weihang Li <hidden> Date: 2021-05-28 09:38:01
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/iwcm.c | 9 ++++-----
drivers/infiniband/core/iwcm.h | 2 +-
2 files changed, 5 insertions(+), 6 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:02
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks. Increase refcount_t from 0 to 1 is
regarded as there is a risk about use-after-free. So it should be set to 1
directly during initialization.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/iwpm_util.c | 12 ++++++++----
drivers/infiniband/core/iwpm_util.h | 2 +-
2 files changed, 9 insertions(+), 5 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:02
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/mad_priv.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:02
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/multicast.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:03
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/multicast.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:03
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks. Increase refcount_t from 0 to 1 is
regarded as there is a risk about use-after-free. So it should be set to 1
directly during initialization.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/multicast.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:04
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/hw/hns/hns_roce_cq.c | 8 ++++----
drivers/infiniband/hw/hns/hns_roce_device.h | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
@@ -446,7 +446,7 @@ struct hns_roce_cq {intcqe_size;unsignedlongcqn;u32vector;-atomic_trefcount;+refcount_trefcount;structcompletionfree;structlist_headsq_list;/* all qps on this send cq */structlist_headrq_list;/* all qps on this recv cq */
From: Weihang Li <hidden> Date: 2021-05-28 09:38:04
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/uverbs.h | 2 +-
drivers/infiniband/core/uverbs_main.c | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:04
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/hw/hns/hns_roce_device.h | 2 +-
drivers/infiniband/hw/hns/hns_roce_srq.c | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
From: Weihang Li <hidden> Date: 2021-05-28 09:38:05
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/ulp/ipoib/ipoib.h | 4 ++--
drivers/infiniband/ulp/ipoib/ipoib_main.c | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
@@ -1287,7 +1287,7 @@ struct ipoib_neigh *ipoib_neigh_get(struct net_device *dev, u8 *daddr)neigh=rcu_dereference_bh(neigh->hnext)){if(memcmp(daddr,neigh->daddr,INFINIBAND_ALEN)==0){/* found, take one ref on behalf of the caller */-if(!atomic_inc_not_zero(&neigh->refcnt)){+if(!refcount_inc_not_zero(&neigh->refcnt)){/* deleted */neigh=NULL;gotoout_unlock;
@@ -1382,7 +1382,7 @@ static struct ipoib_neigh *ipoib_neigh_ctor(u8 *daddr,INIT_LIST_HEAD(&neigh->list);ipoib_cm_set(neigh,NULL);/* one ref on behalf of the caller */-atomic_set(&neigh->refcnt,1);+refcount_set(&neigh->refcnt,1);returnneigh;}
@@ -1414,7 +1414,7 @@ struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr,lockdep_is_held(&priv->lock))){if(memcmp(daddr,neigh->daddr,INFINIBAND_ALEN)==0){/* found, take one ref on behalf of the caller */-if(!atomic_inc_not_zero(&neigh->refcnt)){+if(!refcount_inc_not_zero(&neigh->refcnt)){/* deleted */neigh=NULL;break;
@@ -1429,7 +1429,7 @@ struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr,gotoout_unlock;/* one ref on behalf of the hash table */-atomic_inc(&neigh->refcnt);+refcount_inc(&neigh->refcnt);neigh->alive=jiffies;/* put in hash */rcu_assign_pointer(neigh->hnext,
From: Weihang Li <hidden> Date: 2021-05-28 09:38:05
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/hw/hns/hns_roce_device.h | 2 +-
drivers/infiniband/hw/hns/hns_roce_qp.c | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
From: Jason Gunthorpe <jgg@nvidia.com> Date: 2021-06-08 18:04:17
On Fri, May 28, 2021 at 05:37:34PM +0800, Weihang Li wrote:
quoted hunk
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/mad_priv.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Jason Gunthorpe <jgg@nvidia.com> Date: 2021-06-08 18:08:53
On Fri, May 28, 2021 at 05:37:31PM +0800, Weihang Li wrote:
There are some refcnt in type of atomic_t in RDMA subsystem, almost all of
them is wrote before the refcount_t is acheived in kernel. refcount_t is
better than integer for reference counting, it will WARN on
overflow/underflow and avoid use-after-free risks.
Changes since v3:
* Drop the rdmavt patch because the refcount_t is not suitable for the
logic.
* Link: https://patchwork.kernel.org/project/linux-rdma/cover/1621925504-33019-1-git-send-email-liweihang@huawei.com/
Changes since v2:
* Drop i40iw related parts because this driver will be removed soon.
* Link: https://patchwork.kernel.org/project/linux-rdma/cover/1621590825-60693-1-git-send-email-liweihang@huawei.com/
Changes since v1:
* Split these patches by variable granularity.
* Fix a warning on refcount of struct mcast_group.
* Add a patch on rdmavt.
* Drop "RDMA/hns: Use refcount_t APIs for HEM".
* Link: https://patchwork.kernel.org/project/linux-rdma/cover/1620958299-4869-1-git-send-email-liweihang@huawei.com/
Weihang Li (12):
RDMA/core: Use refcount_t instead of atomic_t on refcount of
iwcm_id_private
RDMA/core: Use refcount_t instead of atomic_t on refcount of
iwpm_admin_data
RDMA/core: Use refcount_t instead of atomic_t on refcount of
ib_mad_snoop_private
RDMA/core: Use refcount_t instead of atomic_t on refcount of
mcast_member
RDMA/core: Use refcount_t instead of atomic_t on refcount of
mcast_port
RDMA/core: Use refcount_t instead of atomic_t on refcount of
ib_uverbs_device
RDMA/hns: Use refcount_t instead of atomic_t for CQ reference counting
RDMA/hns: Use refcount_t instead of atomic_t for SRQ reference
counting
RDMA/hns: Use refcount_t instead of atomic_t for QP reference counting
RDMA/cxgb4: Use refcount_t instead of atomic_t for reference counting
RDMA/ipoib: Use refcount_t instead of atomic_t for reference counting
Applied to for-next, thanks
RDMA/core: Use refcount_t instead of atomic_t on refcount of
mcast_group
On Fri, May 28, 2021 at 05:37:34PM +0800, Weihang Li wrote:
quoted
The refcount_t API will WARN on underflow and overflow of a reference
counter, and avoid use-after-free risks.
Signed-off-by: Weihang Li <redacted>
---
drivers/infiniband/core/mad_priv.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)