Use rcu_read_lock() for protecting read side operations in rxe_pool.c. Signed-off-by: Bob Pearson <rpearsonhpe@xxxxxxxxx> --- drivers/infiniband/sw/rxe/rxe_pool.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c b/drivers/infiniband/sw/rxe/rxe_pool.c index 1d1e10290991..713df1ce2bbc 100644 --- a/drivers/infiniband/sw/rxe/rxe_pool.c +++ b/drivers/infiniband/sw/rxe/rxe_pool.c @@ -202,16 +202,15 @@ int __rxe_add_to_pool(struct rxe_pool *pool, struct rxe_pool_elem *elem) void *rxe_pool_get_index(struct rxe_pool *pool, u32 index) { struct rxe_pool_elem *elem; - unsigned long flags; void *obj; - spin_lock_irqsave(&pool->xa.xa_lock, flags); + rcu_read_lock(); elem = xa_load(&pool->xa, index); if (elem && elem->enabled && kref_get_unless_zero(&elem->ref_cnt)) obj = elem->obj; else obj = NULL; - spin_unlock_irqrestore(&pool->xa.xa_lock, flags); + rcu_read_unlock(); return obj; } @@ -259,13 +258,18 @@ int __rxe_drop_ref(struct rxe_pool_elem *elem) &pool->xa.xa_lock); } - int __rxe_drop_wait(struct rxe_pool_elem *elem) { struct rxe_pool *pool = elem->pool; static int timeout = RXE_POOL_TIMEOUT; int ret; + if (elem->enabled) { + pr_warn_once("%s#%d: should be disabled by now\n", + elem->pool->name + 4, elem->index); + elem->enabled = false; + } + __rxe_drop_ref(elem); if (timeout) { @@ -284,6 +288,7 @@ int __rxe_drop_wait(struct rxe_pool_elem *elem) if (pool->cleanup) pool->cleanup(elem); + /* if we reach here it is safe to free the object */ if (pool->flags & RXE_POOL_ALLOC) kfree(elem->obj); -- 2.32.0