net/mlx5: allow limiting the indexed pool maximum index
authorSuanming Mou <suanmingm@nvidia.com>
Tue, 13 Jul 2021 08:44:35 +0000 (11:44 +0300)
committerRaslan Darawsheh <rasland@nvidia.com>
Thu, 15 Jul 2021 13:19:01 +0000 (15:19 +0200)
Some ipool instances in the driver are used as ID\index allocator and
added other logic in order to work with limited index values.

Add a new configuration for ipool specify the maximum index value.
The ipool will ensure that no index bigger than the maximum value is
provided.

Use this configuration in ID allocator cases instead of the current
logics. This patch add the maximum ID configurable for the index pool.

Signed-off-by: Suanming Mou <suanmingm@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/net/mlx5/mlx5_utils.c
drivers/net/mlx5/mlx5_utils.h

index 18fe23e..bf2b2eb 100644 (file)
@@ -270,6 +270,9 @@ mlx5_ipool_create(struct mlx5_indexed_pool_config *cfg)
                if (i > 0)
                        pool->grow_tbl[i] += pool->grow_tbl[i - 1];
        }
+       if (!pool->cfg.max_idx)
+               pool->cfg.max_idx =
+                       mlx5_trunk_idx_offset_get(pool, TRUNK_MAX_IDX + 1);
        return pool;
 }
 
@@ -282,9 +285,11 @@ mlx5_ipool_grow(struct mlx5_indexed_pool *pool)
        size_t trunk_size = 0;
        size_t data_size;
        size_t bmp_size;
-       uint32_t idx;
+       uint32_t idx, cur_max_idx, i;
 
-       if (pool->n_trunk_valid == TRUNK_MAX_IDX)
+       cur_max_idx = mlx5_trunk_idx_offset_get(pool, pool->n_trunk_valid);
+       if (pool->n_trunk_valid == TRUNK_MAX_IDX ||
+           cur_max_idx >= pool->cfg.max_idx)
                return -ENOMEM;
        if (pool->n_trunk_valid == pool->n_trunk) {
                /* No free trunk flags, expand trunk list. */
@@ -336,6 +341,11 @@ mlx5_ipool_grow(struct mlx5_indexed_pool *pool)
        trunk->bmp = rte_bitmap_init_with_all_set(data_size, &trunk->data
                     [RTE_CACHE_LINE_ROUNDUP(data_size * pool->cfg.size)],
                     bmp_size);
+       /* Clear the overhead bits in the trunk if it happens. */
+       if (cur_max_idx + data_size > pool->cfg.max_idx) {
+               for (i = pool->cfg.max_idx - cur_max_idx; i < data_size; i++)
+                       rte_bitmap_clear(trunk->bmp, i);
+       }
        MLX5_ASSERT(trunk->bmp);
        pool->n_trunk_valid++;
 #ifdef POOL_DEBUG
index b54517c..15870e1 100644 (file)
@@ -208,6 +208,7 @@ struct mlx5_indexed_pool_config {
        uint32_t need_lock:1;
        /* Lock is needed for multiple thread usage. */
        uint32_t release_mem_en:1; /* Rlease trunk when it is free. */
+       uint32_t max_idx; /* The maximum index can be allocated. */
        const char *type; /* Memory allocate type name. */
        void *(*malloc)(uint32_t flags, size_t size, unsigned int align,
                        int socket);