Need to ensure that kref_put does not run concurrently with the loop inside rxe_pool_get_key. Signed-off-by: Maksym Planeta <mplaneta@xxxxxxxxxxxxxxxxxxxx> --- drivers/infiniband/sw/rxe/rxe_pool.c | 18 ++++++++++++++++++ drivers/infiniband/sw/rxe/rxe_pool.h | 4 +--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c b/drivers/infiniband/sw/rxe/rxe_pool.c index efa9bab01e02..30a887cf9200 100644 --- a/drivers/infiniband/sw/rxe/rxe_pool.c +++ b/drivers/infiniband/sw/rxe/rxe_pool.c @@ -536,3 +536,21 @@ void *rxe_pool_get_key(struct rxe_pool *pool, void *key) read_unlock_irqrestore(&pool->pool_lock, flags); return node ? elem : NULL; } + +static void rxe_dummy_release(struct kref *kref) +{ +} + +void rxe_drop_ref(struct rxe_pool_entry *pelem) +{ + int res; + struct rxe_pool *pool = pelem->pool; + unsigned long flags; + + write_lock_irqsave(&pool->pool_lock, flags); + res = kref_put(&pelem->ref_cnt, rxe_dummy_release); + write_unlock_irqrestore(&pool->pool_lock, flags); + if (res) { + rxe_elem_release(&pelem->ref_cnt); + } +} diff --git a/drivers/infiniband/sw/rxe/rxe_pool.h b/drivers/infiniband/sw/rxe/rxe_pool.h index 5c6a9429f541..b90cc84c5511 100644 --- a/drivers/infiniband/sw/rxe/rxe_pool.h +++ b/drivers/infiniband/sw/rxe/rxe_pool.h @@ -166,8 +166,6 @@ static inline void rxe_add_ref(struct rxe_pool_entry *pelem) { } /* drop a reference on an object */ -static inline void rxe_drop_ref(struct rxe_pool_entry *pelem) { - kref_put(&pelem->ref_cnt, rxe_elem_release); -} +void rxe_drop_ref(struct rxe_pool_entry *pelem); #endif /* RXE_POOL_H */ -- 2.20.1