IB/rxe: put the pool on allocation failure
authorDoug Ledford <dledford@redhat.com>
Mon, 9 Oct 2017 13:11:32 +0000 (09:11 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 10 Nov 2018 15:42:52 +0000 (07:42 -0800)
[ Upstream commit 6b9f8970cd30929cb6b372fa44fa66da9e59c650 ]

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: 4831ca9e4a8e ("IB/rxe: check for allocation failure on elem")
Suggested-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/sw/rxe/rxe_pool.c

index 1c4e5b2e683508a04fbaaa98c4cd2ad95fdbc644..527ca662da69dda14a6b671e6f8918433d136677 100644 (file)
@@ -402,23 +402,25 @@ void *rxe_alloc(struct rxe_pool *pool)
 
        kref_get(&pool->rxe->ref_cnt);
 
-       if (atomic_inc_return(&pool->num_elem) > pool->max_elem) {
-               atomic_dec(&pool->num_elem);
-               rxe_dev_put(pool->rxe);
-               rxe_pool_put(pool);
-               return NULL;
-       }
+       if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
+               goto out_put_pool;
 
        elem = kmem_cache_zalloc(pool_cache(pool),
                                 (pool->flags & RXE_POOL_ATOMIC) ?
                                 GFP_ATOMIC : GFP_KERNEL);
        if (!elem)
-               return NULL;
+               goto out_put_pool;
 
        elem->pool = pool;
        kref_init(&elem->ref_cnt);
 
        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)