atomic_set(&pool->num_elem, 0);
- kref_init(&pool->ref_cnt);
-
rwlock_init(&pool->pool_lock);
if (rxe_type_info[type].flags & RXE_POOL_INDEX) {
return err;
}
-static void rxe_pool_release(struct kref *kref)
-{
- struct rxe_pool *pool = container_of(kref, struct rxe_pool, ref_cnt);
-
- pool->state = RXE_POOL_STATE_INVALID;
- kfree(pool->index.table);
-}
-
-static void rxe_pool_put(struct rxe_pool *pool)
-{
- kref_put(&pool->ref_cnt, rxe_pool_release);
-}
-
void rxe_pool_cleanup(struct rxe_pool *pool)
{
unsigned long flags;
pool_name(pool));
write_unlock_irqrestore(&pool->pool_lock, flags);
- rxe_pool_put(pool);
+ pool->state = RXE_POOL_STATE_INVALID;
+ kfree(pool->index.table);
}
static u32 alloc_index(struct rxe_pool *pool)
if (pool->state != RXE_POOL_STATE_VALID)
return NULL;
- kref_get(&pool->ref_cnt);
-
- if (!ib_device_try_get(&pool->rxe->ib_dev))
- goto out_put_pool;
-
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
goto out_cnt;
out_cnt:
atomic_dec(&pool->num_elem);
- ib_device_put(&pool->rxe->ib_dev);
-out_put_pool:
- rxe_pool_put(pool);
return NULL;
}
return NULL;
}
- kref_get(&pool->ref_cnt);
read_unlock_irqrestore(&pool->pool_lock, flags);
- if (!ib_device_try_get(&pool->rxe->ib_dev))
- goto out_put_pool;
-
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
goto out_cnt;
out_cnt:
atomic_dec(&pool->num_elem);
- ib_device_put(&pool->rxe->ib_dev);
-out_put_pool:
- rxe_pool_put(pool);
return NULL;
}
read_unlock_irqrestore(&pool->pool_lock, flags);
return -EINVAL;
}
- kref_get(&pool->ref_cnt);
read_unlock_irqrestore(&pool->pool_lock, flags);
- if (!ib_device_try_get(&pool->rxe->ib_dev))
- goto out_put_pool;
-
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
goto out_cnt;
out_cnt:
atomic_dec(&pool->num_elem);
- ib_device_put(&pool->rxe->ib_dev);
-out_put_pool:
- rxe_pool_put(pool);
return -EINVAL;
}
}
atomic_dec(&pool->num_elem);
- ib_device_put(&pool->rxe->ib_dev);
- rxe_pool_put(pool);
}
void *rxe_pool_get_index(struct rxe_pool *pool, u32 index)