Commit 18addd96 authored by Doug Ledford's avatar Doug Ledford Committed by Greg Kroah-Hartman

IB/rxe: put the pool on allocation failure

[ Upstream commit 6b9f8970 ]

If the allocation of elem fails, it is not sufficient to simply check
for NULL and return.  We need to also put our reference on the pool or
else we will leave the pool with a permanent ref count and we will never
be able to free it.

Fixes: 4831ca9e ("IB/rxe: check for allocation failure on elem")
Suggested-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 8c954368
...@@ -394,23 +394,25 @@ void *rxe_alloc(struct rxe_pool *pool) ...@@ -394,23 +394,25 @@ void *rxe_alloc(struct rxe_pool *pool)
kref_get(&pool->rxe->ref_cnt); kref_get(&pool->rxe->ref_cnt);
if (atomic_inc_return(&pool->num_elem) > pool->max_elem) { if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
atomic_dec(&pool->num_elem); goto out_put_pool;
rxe_dev_put(pool->rxe);
rxe_pool_put(pool);
return NULL;
}
elem = kmem_cache_zalloc(pool_cache(pool), elem = kmem_cache_zalloc(pool_cache(pool),
(pool->flags & RXE_POOL_ATOMIC) ? (pool->flags & RXE_POOL_ATOMIC) ?
GFP_ATOMIC : GFP_KERNEL); GFP_ATOMIC : GFP_KERNEL);
if (!elem) if (!elem)
return NULL; goto out_put_pool;
elem->pool = pool; elem->pool = pool;
kref_init(&elem->ref_cnt); kref_init(&elem->ref_cnt);
return elem; return elem;
out_put_pool:
atomic_dec(&pool->num_elem);
rxe_dev_put(pool->rxe);
rxe_pool_put(pool);
return NULL;
} }
void rxe_elem_release(struct kref *kref) void rxe_elem_release(struct kref *kref)
......
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