Commit 58d33b4f authored by Weihang Li's avatar Weihang Li Committed by Jason Gunthorpe

RDMA/core: Use refcount_t instead of atomic_t on refcount of mcast_port

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.comSigned-off-by: default avatarWeihang Li <liweihang@huawei.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent cd74db6c
...@@ -61,7 +61,7 @@ struct mcast_port { ...@@ -61,7 +61,7 @@ struct mcast_port {
struct mcast_device *dev; struct mcast_device *dev;
spinlock_t lock; spinlock_t lock;
struct rb_root table; struct rb_root table;
atomic_t refcount; refcount_t refcount;
struct completion comp; struct completion comp;
u32 port_num; u32 port_num;
}; };
...@@ -178,7 +178,7 @@ static struct mcast_group *mcast_insert(struct mcast_port *port, ...@@ -178,7 +178,7 @@ static struct mcast_group *mcast_insert(struct mcast_port *port,
static void deref_port(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); complete(&port->comp);
} }
...@@ -589,7 +589,7 @@ static struct mcast_group *acquire_group(struct mcast_port *port, ...@@ -589,7 +589,7 @@ static struct mcast_group *acquire_group(struct mcast_port *port,
kfree(group); kfree(group);
group = cur_group; group = cur_group;
} else } else
atomic_inc(&port->refcount); refcount_inc(&port->refcount);
found: found:
atomic_inc(&group->refcount); atomic_inc(&group->refcount);
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
...@@ -840,7 +840,7 @@ static int mcast_add_one(struct ib_device *device) ...@@ -840,7 +840,7 @@ static int mcast_add_one(struct ib_device *device)
spin_lock_init(&port->lock); spin_lock_init(&port->lock);
port->table = RB_ROOT; port->table = RB_ROOT;
init_completion(&port->comp); init_completion(&port->comp);
atomic_set(&port->refcount, 1); refcount_set(&port->refcount, 1);
++count; ++count;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment