The refcount_t API will WARN on underflow and overflow of a reference counter, and avoid use-after-free risks. Cc: Faisal Latif <faisal.latif@xxxxxxxxx> Cc: Shiraz Saleem <shiraz.saleem@xxxxxxxxx> Signed-off-by: Weihang Li <liweihang@xxxxxxxxxx> --- drivers/infiniband/hw/i40iw/i40iw_cm.c | 10 +++++----- drivers/infiniband/hw/i40iw/i40iw_cm.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c index 2450b7d..c1becb9 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_cm.c +++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c @@ -1491,7 +1491,7 @@ static struct i40iw_cm_listener *i40iw_find_listener( !memcmp(listen_addr, ip_zero, sizeof(listen_addr))) && (listen_port == dst_port) && (listener_state & listen_node->listener_state)) { - atomic_inc(&listen_node->ref_count); + refcount_inc(&listen_node->ref_count); spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); return listen_node; } @@ -1910,7 +1910,7 @@ static int i40iw_dec_refcnt_listen(struct i40iw_cm_core *cm_core, } } - if (!atomic_dec_return(&listener->ref_count)) { + if (refcount_dec_and_test(&listener->ref_count)) { spin_lock_irqsave(&cm_core->listen_list_lock, flags); list_del(&listener->list); spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); @@ -2870,7 +2870,7 @@ static struct i40iw_cm_listener *i40iw_make_listen_node( I40IW_CM_LISTENER_EITHER_STATE); if (listener && (listener->listener_state == I40IW_CM_LISTENER_ACTIVE_STATE)) { - atomic_dec(&listener->ref_count); + refcount_dec(&listener->ref_count); i40iw_debug(cm_core->dev, I40IW_DEBUG_CM, "Not creating listener since it already exists\n"); @@ -2888,7 +2888,7 @@ static struct i40iw_cm_listener *i40iw_make_listen_node( INIT_LIST_HEAD(&listener->child_listen_list); - atomic_set(&listener->ref_count, 1); + refcount_set(&listener->ref_count, 1); } else { listener->reused_node = 1; } @@ -3213,7 +3213,7 @@ void i40iw_receive_ilq(struct i40iw_sc_vsi *vsi, struct i40iw_puda_buf *rbuf) I40IW_DEBUG_CM, "%s allocate node failed\n", __func__); - atomic_dec(&listener->ref_count); + refcount_dec(&listener->ref_count); return; } if (!tcph->rst && !tcph->fin) { diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.h b/drivers/infiniband/hw/i40iw/i40iw_cm.h index 6e43e4d..839966a 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_cm.h +++ b/drivers/infiniband/hw/i40iw/i40iw_cm.h @@ -291,7 +291,7 @@ struct i40iw_cm_listener { u32 loc_addr[4]; u16 loc_port; struct iw_cm_id *cm_id; - atomic_t ref_count; + refcount_t ref_count; struct i40iw_device *iwdev; atomic_t pend_accepts_cnt; int backlog; -- 2.7.4