Currently rxe_add_ref() calls kref_get() which increments the reference count even if the object has already been released. Change this to refcount_inc_not_zero() which will only succeed if the current ref count is larger than zero. This change exposes some reference counting errors which will be fixed in the following patches. Signed-off-by: Bob Pearson <rpearsonhpe@xxxxxxxxx> --- drivers/infiniband/sw/rxe/rxe_pool.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/sw/rxe/rxe_pool.h b/drivers/infiniband/sw/rxe/rxe_pool.h index 6cd2366d5407..46f2abc359f3 100644 --- a/drivers/infiniband/sw/rxe/rxe_pool.h +++ b/drivers/infiniband/sw/rxe/rxe_pool.h @@ -7,6 +7,8 @@ #ifndef RXE_POOL_H #define RXE_POOL_H +#include <linux/refcount.h> + enum rxe_pool_flags { RXE_POOL_AUTO_INDEX = BIT(1), RXE_POOL_EXT_INDEX = BIT(2), @@ -70,9 +72,15 @@ int __rxe_pool_add(struct rxe_pool *pool, struct rxe_pool_elem *elem); void *rxe_pool_get_index(struct rxe_pool *pool, unsigned long index); -#define rxe_add_ref(obj) kref_get(&(obj)->elem.ref_cnt) +static inline int __rxe_add_ref(struct rxe_pool_elem *elem) +{ + return refcount_inc_not_zero(&elem->ref_cnt.refcount); +} + +#define rxe_add_ref(obj) __rxe_add_ref(&(obj)->elem) void rxe_elem_release(struct kref *kref); + #define rxe_drop_ref(obj) kref_put(&(obj)->elem.ref_cnt, rxe_elem_release) #endif /* RXE_POOL_H */ -- 2.30.2