RDMA/core: Use refcount_t instead of atomic_t on refcount of mcast_port
authorWeihang Li <liweihang@huawei.com>
Fri, 28 May 2021 09:37:36 +0000 (17:37 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 8 Jun 2021 17:45:07 +0000 (14:45 -0300)
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-6-git-send-email-liweihang@huawei.com
Signed-off-by: Weihang Li <liweihang@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/multicast.c

index de134a43b776db8dfca7be26d1787bae4e2ef062..a236532a902616bccae811867999e1dd904e8576 100644 (file)
@@ -61,7 +61,7 @@ struct mcast_port {
        struct mcast_device     *dev;
        spinlock_t              lock;
        struct rb_root          table;
-       atomic_t                refcount;
+       refcount_t              refcount;
        struct completion       comp;
        u32                     port_num;
 };
@@ -178,7 +178,7 @@ static struct mcast_group *mcast_insert(struct mcast_port *port,
 
 static void deref_port(struct mcast_port *port)
 {
-       if (atomic_dec_and_test(&port->refcount))
+       if (refcount_dec_and_test(&port->refcount))
                complete(&port->comp);
 }
 
@@ -589,7 +589,7 @@ static struct mcast_group *acquire_group(struct mcast_port *port,
                kfree(group);
                group = cur_group;
        } else
-               atomic_inc(&port->refcount);
+               refcount_inc(&port->refcount);
 found:
        atomic_inc(&group->refcount);
        spin_unlock_irqrestore(&port->lock, flags);
@@ -840,7 +840,7 @@ static int mcast_add_one(struct ib_device *device)
                spin_lock_init(&port->lock);
                port->table = RB_ROOT;
                init_completion(&port->comp);
-               atomic_set(&port->refcount, 1);
+               refcount_set(&port->refcount, 1);
                ++count;
        }