When the counter countainer has no more space to store more counter
pools try to resize the container to allow more pools to be created.
So, the only limitation for the maximum counter number is the memory.
Signed-off-by: Matan Azrad <matan@mellanox.com>
Acked-by: Shahaf Shuler <shahafs@mellanox.com>
-#define MLX5_CNT_CONTAINER_SIZE 64
+#define MLX5_CNT_CONTAINER_RESIZE 64
#define MLX5_CNT_CONTAINER(priv, batch) (&(priv)->sh->cmng.ccont[batch])
/**
#define MLX5_CNT_CONTAINER(priv, batch) (&(priv)->sh->cmng.ccont[batch])
/**
- * Prepare a counter container.
+ * Resize a counter container.
*
* @param[in] dev
* Pointer to the Ethernet device structure.
*
* @param[in] dev
* Pointer to the Ethernet device structure.
* The container pointer on success, otherwise NULL and rte_errno is set.
*/
static struct mlx5_pools_container *
* The container pointer on success, otherwise NULL and rte_errno is set.
*/
static struct mlx5_pools_container *
-flow_dv_container_prepare(struct rte_eth_dev *dev, uint32_t batch)
+flow_dv_container_resize(struct rte_eth_dev *dev, uint32_t batch)
{
struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_pools_container *cont = MLX5_CNT_CONTAINER(priv, batch);
struct mlx5_counter_stats_mem_mng *mem_mng;
{
struct mlx5_priv *priv = dev->data->dev_private;
struct mlx5_pools_container *cont = MLX5_CNT_CONTAINER(priv, batch);
struct mlx5_counter_stats_mem_mng *mem_mng;
- uint32_t size = MLX5_CNT_CONTAINER_SIZE;
- uint32_t mem_size = sizeof(struct mlx5_flow_counter_pool *) * size;
-
- cont->pools = rte_calloc(__func__, 1, mem_size, 0);
- if (!cont->pools) {
+ uint32_t resize = cont->n + MLX5_CNT_CONTAINER_RESIZE;
+ uint32_t mem_size = sizeof(struct mlx5_flow_counter_pool *) * resize;
+ struct mlx5_flow_counter_pool **new_pools = rte_calloc(__func__, 1,
+ mem_size, 0);
+ if (!new_pools) {
rte_errno = ENOMEM;
return NULL;
}
rte_errno = ENOMEM;
return NULL;
}
- mem_mng = flow_dv_create_counter_stat_mem_mng(dev, size);
+ mem_mng = flow_dv_create_counter_stat_mem_mng(dev,
+ MLX5_CNT_CONTAINER_RESIZE);
- cont->n = size;
- TAILQ_INIT(&cont->pool_list);
+ if (cont->n) {
+ memcpy(new_pools, cont->pools,
+ cont->n * sizeof(struct mlx5_flow_counter_pool *));
+ rte_free(cont->pools);
+ } else {
+ TAILQ_INIT(&cont->pool_list);
+ }
+ cont->pools = new_pools;
+ cont->n = resize;
cont->init_mem_mng = mem_mng;
return cont;
}
cont->init_mem_mng = mem_mng;
return cont;
}
struct mlx5_pools_container *cont = MLX5_CNT_CONTAINER(priv, batch);
uint32_t size;
struct mlx5_pools_container *cont = MLX5_CNT_CONTAINER(priv, batch);
uint32_t size;
- if (!cont->n) {
- cont = flow_dv_container_prepare(dev, batch);
+ if (cont->n == cont->n_valid) {
+ cont = flow_dv_container_resize(dev, batch);
- } else if (cont->n == cont->n_valid) {
- DRV_LOG(ERR, "No space in container to allocate a new pool\n");
- rte_errno = ENOSPC;
- return NULL;
}
size = sizeof(*pool) + MLX5_COUNTERS_PER_POOL *
sizeof(struct mlx5_flow_counter);
}
size = sizeof(*pool) + MLX5_COUNTERS_PER_POOL *
sizeof(struct mlx5_flow_counter);
return NULL;
}
pool->min_dcs = dcs;
return NULL;
}
pool->min_dcs = dcs;
- pool->raw = cont->init_mem_mng->raws + cont->n_valid;
+ pool->raw = cont->init_mem_mng->raws + cont->n_valid %
+ MLX5_CNT_CONTAINER_RESIZE;
TAILQ_INIT(&pool->counters);
TAILQ_INSERT_TAIL(&cont->pool_list, pool, next);
cont->pools[cont->n_valid] = pool;
TAILQ_INIT(&pool->counters);
TAILQ_INSERT_TAIL(&cont->pool_list, pool, next);
cont->pools[cont->n_valid] = pool;