RDMA/hns: Use refcount_t instead of atomic_t for SRQ reference counting
The refcount_t API will WARN on underflow and overflow of a reference counter, and avoid use-after-free risks. Link: https://lore.kernel.org/r/1622194663-2383-10-git-send-email-liweihang@huawei.com Signed-off-by: Weihang Li <liweihang@huawei.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
cc9e5a844a
commit
33649cd3f9
|
@ -471,7 +471,7 @@ struct hns_roce_srq {
|
|||
u32 xrcdn;
|
||||
void __iomem *db_reg;
|
||||
|
||||
atomic_t refcount;
|
||||
refcount_t refcount;
|
||||
struct completion free;
|
||||
|
||||
struct hns_roce_mtr buf_mtr;
|
||||
|
|
|
@ -17,7 +17,7 @@ void hns_roce_srq_event(struct hns_roce_dev *hr_dev, u32 srqn, int event_type)
|
|||
xa_lock(&srq_table->xa);
|
||||
srq = xa_load(&srq_table->xa, srqn & (hr_dev->caps.num_srqs - 1));
|
||||
if (srq)
|
||||
atomic_inc(&srq->refcount);
|
||||
refcount_inc(&srq->refcount);
|
||||
xa_unlock(&srq_table->xa);
|
||||
|
||||
if (!srq) {
|
||||
|
@ -27,7 +27,7 @@ void hns_roce_srq_event(struct hns_roce_dev *hr_dev, u32 srqn, int event_type)
|
|||
|
||||
srq->event(srq, event_type);
|
||||
|
||||
if (atomic_dec_and_test(&srq->refcount))
|
||||
if (refcount_dec_and_test(&srq->refcount))
|
||||
complete(&srq->free);
|
||||
}
|
||||
|
||||
|
@ -149,7 +149,7 @@ static void free_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
|
|||
|
||||
xa_erase(&srq_table->xa, srq->srqn);
|
||||
|
||||
if (atomic_dec_and_test(&srq->refcount))
|
||||
if (refcount_dec_and_test(&srq->refcount))
|
||||
complete(&srq->free);
|
||||
wait_for_completion(&srq->free);
|
||||
|
||||
|
@ -417,7 +417,7 @@ int hns_roce_create_srq(struct ib_srq *ib_srq,
|
|||
|
||||
srq->db_reg = hr_dev->reg_base + SRQ_DB_REG;
|
||||
srq->event = hns_roce_ib_srq_event;
|
||||
atomic_set(&srq->refcount, 1);
|
||||
refcount_set(&srq->refcount, 1);
|
||||
init_completion(&srq->free);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue