Skip to content

Commit

Permalink
RDMA/hns: Use refcount_t instead of atomic_t for CQ reference counting
Browse files Browse the repository at this point in the history
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-9-git-send-email-liweihang@huawei.com
Signed-off-by: Weihang Li <liweihang@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
  • Loading branch information
Weihang Li authored and Jason Gunthorpe committed Jun 8, 2021
1 parent 58d33b4 commit cc9e5a8
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 5 deletions.
8 changes: 4 additions & 4 deletions drivers/infiniband/hw/hns/hns_roce_cq.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ static int alloc_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
hr_cq->cons_index = 0;
hr_cq->arm_sn = 1;

atomic_set(&hr_cq->refcount, 1);
refcount_set(&hr_cq->refcount, 1);
init_completion(&hr_cq->free);

return 0;
Expand Down Expand Up @@ -188,7 +188,7 @@ static void free_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq)
synchronize_irq(hr_dev->eq_table.eq[hr_cq->vector].irq);

/* wait for all interrupt processed */
if (atomic_dec_and_test(&hr_cq->refcount))
if (refcount_dec_and_test(&hr_cq->refcount))
complete(&hr_cq->free);
wait_for_completion(&hr_cq->free);

Expand Down Expand Up @@ -480,7 +480,7 @@ void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type)
return;
}

atomic_inc(&hr_cq->refcount);
refcount_inc(&hr_cq->refcount);

ibcq = &hr_cq->ib_cq;
if (ibcq->event_handler) {
Expand All @@ -490,7 +490,7 @@ void hns_roce_cq_event(struct hns_roce_dev *hr_dev, u32 cqn, int event_type)
ibcq->event_handler(&event, ibcq->cq_context);
}

if (atomic_dec_and_test(&hr_cq->refcount))
if (refcount_dec_and_test(&hr_cq->refcount))
complete(&hr_cq->free);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/infiniband/hw/hns/hns_roce_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ struct hns_roce_cq {
int cqe_size;
unsigned long cqn;
u32 vector;
atomic_t refcount;
refcount_t refcount;
struct completion free;
struct list_head sq_list; /* all qps on this send cq */
struct list_head rq_list; /* all qps on this recv cq */
Expand Down

0 comments on commit cc9e5a8

Please sign in to comment.