mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
Merge branch 'net-mlx5-hws-single-flow-counter-support'
Tariq Toukan says: ==================== net/mlx5: HWS single flow counter support This small series refactors the flow counter bulk initialization code and extends it so that single flow counters are also usable by hardware steering (HWS) rules. Patches 1-2 refactor the bulk init path: first by factoring out common flow counter bulk initialization into mlx5_fc_bulk_init(), then by splitting the bitmap allocation into mlx5_fs_bulk_bitmap_alloc(), with no functional changes. Patch 3 initializes bulk data for counters allocated via mlx5_fc_single_alloc(), so they can be safely used by HWS rules. ==================== Link: https://patch.msgid.link/1768210825-1598472-1-git-send-email-tariqt@nvidia.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
d281dff93a
|
|
@ -308,7 +308,8 @@ struct mlx5_flow_root_namespace {
|
|||
};
|
||||
|
||||
enum mlx5_fc_type {
|
||||
MLX5_FC_TYPE_ACQUIRED = 0,
|
||||
MLX5_FC_TYPE_POOL_ACQUIRED = 0,
|
||||
MLX5_FC_TYPE_SINGLE,
|
||||
MLX5_FC_TYPE_LOCAL,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ static void mlx5_fc_stats_query_all_counters(struct mlx5_core_dev *dev)
|
|||
static void mlx5_fc_free(struct mlx5_core_dev *dev, struct mlx5_fc *counter)
|
||||
{
|
||||
mlx5_cmd_fc_free(dev, counter->id);
|
||||
kfree(counter->bulk);
|
||||
kfree(counter);
|
||||
}
|
||||
|
||||
|
|
@ -163,7 +164,7 @@ static void mlx5_fc_release(struct mlx5_core_dev *dev, struct mlx5_fc *counter)
|
|||
if (WARN_ON(counter->type == MLX5_FC_TYPE_LOCAL))
|
||||
return;
|
||||
|
||||
if (counter->bulk)
|
||||
if (counter->type == MLX5_FC_TYPE_POOL_ACQUIRED)
|
||||
mlx5_fc_pool_release_counter(&fc_stats->fc_pool, counter);
|
||||
else
|
||||
mlx5_fc_free(dev, counter);
|
||||
|
|
@ -220,8 +221,16 @@ static void mlx5_fc_stats_work(struct work_struct *work)
|
|||
mlx5_fc_stats_query_all_counters(dev);
|
||||
}
|
||||
|
||||
static void mlx5_fc_bulk_init(struct mlx5_fc_bulk *fc_bulk, u32 base_id)
|
||||
{
|
||||
fc_bulk->base_id = base_id;
|
||||
refcount_set(&fc_bulk->hws_data.hws_action_refcount, 0);
|
||||
mutex_init(&fc_bulk->hws_data.lock);
|
||||
}
|
||||
|
||||
static struct mlx5_fc *mlx5_fc_single_alloc(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fc_bulk *fc_bulk;
|
||||
struct mlx5_fc *counter;
|
||||
int err;
|
||||
|
||||
|
|
@ -229,13 +238,26 @@ static struct mlx5_fc *mlx5_fc_single_alloc(struct mlx5_core_dev *dev)
|
|||
if (!counter)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
err = mlx5_cmd_fc_alloc(dev, &counter->id);
|
||||
if (err) {
|
||||
kfree(counter);
|
||||
return ERR_PTR(err);
|
||||
fc_bulk = kzalloc(sizeof(*fc_bulk), GFP_KERNEL);
|
||||
if (!fc_bulk) {
|
||||
err = -ENOMEM;
|
||||
goto free_counter;
|
||||
}
|
||||
err = mlx5_cmd_fc_alloc(dev, &counter->id);
|
||||
if (err)
|
||||
goto free_bulk;
|
||||
|
||||
counter->type = MLX5_FC_TYPE_SINGLE;
|
||||
mlx5_fs_bulk_init(&fc_bulk->fs_bulk, 1);
|
||||
mlx5_fc_bulk_init(fc_bulk, counter->id);
|
||||
counter->bulk = fc_bulk;
|
||||
return counter;
|
||||
|
||||
free_bulk:
|
||||
kfree(fc_bulk);
|
||||
free_counter:
|
||||
kfree(counter);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static struct mlx5_fc *mlx5_fc_acquire(struct mlx5_core_dev *dev, bool aging)
|
||||
|
|
@ -442,17 +464,18 @@ static struct mlx5_fs_bulk *mlx5_fc_bulk_create(struct mlx5_core_dev *dev,
|
|||
if (!fc_bulk)
|
||||
return NULL;
|
||||
|
||||
if (mlx5_fs_bulk_init(dev, &fc_bulk->fs_bulk, bulk_len))
|
||||
mlx5_fs_bulk_init(&fc_bulk->fs_bulk, bulk_len);
|
||||
|
||||
if (mlx5_fs_bulk_bitmap_alloc(dev, &fc_bulk->fs_bulk))
|
||||
goto fc_bulk_free;
|
||||
|
||||
if (mlx5_cmd_fc_bulk_alloc(dev, alloc_bitmask, &base_id))
|
||||
goto fs_bulk_cleanup;
|
||||
fc_bulk->base_id = base_id;
|
||||
|
||||
mlx5_fc_bulk_init(fc_bulk, base_id);
|
||||
for (i = 0; i < bulk_len; i++)
|
||||
mlx5_fc_init(&fc_bulk->fcs[i], fc_bulk, base_id + i);
|
||||
|
||||
refcount_set(&fc_bulk->hws_data.hws_action_refcount, 0);
|
||||
mutex_init(&fc_bulk->hws_data.lock);
|
||||
return &fc_bulk->fs_bulk;
|
||||
|
||||
fs_bulk_cleanup:
|
||||
|
|
@ -560,10 +583,8 @@ mlx5_fc_local_create(u32 counter_id, u32 offset, u32 bulk_size)
|
|||
|
||||
counter->type = MLX5_FC_TYPE_LOCAL;
|
||||
counter->id = counter_id;
|
||||
fc_bulk->base_id = counter_id - offset;
|
||||
fc_bulk->fs_bulk.bulk_len = bulk_size;
|
||||
refcount_set(&fc_bulk->hws_data.hws_action_refcount, 0);
|
||||
mutex_init(&fc_bulk->hws_data.lock);
|
||||
mlx5_fs_bulk_init(&fc_bulk->fs_bulk, bulk_size);
|
||||
mlx5_fc_bulk_init(fc_bulk, counter_id - offset);
|
||||
counter->bulk = fc_bulk;
|
||||
refcount_set(&counter->fc_local_refcount, 1);
|
||||
return counter;
|
||||
|
|
|
|||
|
|
@ -4,23 +4,27 @@
|
|||
#include <mlx5_core.h>
|
||||
#include "fs_pool.h"
|
||||
|
||||
int mlx5_fs_bulk_init(struct mlx5_core_dev *dev, struct mlx5_fs_bulk *fs_bulk,
|
||||
int bulk_len)
|
||||
int mlx5_fs_bulk_bitmap_alloc(struct mlx5_core_dev *dev,
|
||||
struct mlx5_fs_bulk *fs_bulk)
|
||||
{
|
||||
int i;
|
||||
|
||||
fs_bulk->bitmask = kvcalloc(BITS_TO_LONGS(bulk_len), sizeof(unsigned long),
|
||||
GFP_KERNEL);
|
||||
fs_bulk->bitmask = kvcalloc(BITS_TO_LONGS(fs_bulk->bulk_len),
|
||||
sizeof(unsigned long), GFP_KERNEL);
|
||||
if (!fs_bulk->bitmask)
|
||||
return -ENOMEM;
|
||||
|
||||
fs_bulk->bulk_len = bulk_len;
|
||||
for (i = 0; i < bulk_len; i++)
|
||||
for (i = 0; i < fs_bulk->bulk_len; i++)
|
||||
set_bit(i, fs_bulk->bitmask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mlx5_fs_bulk_init(struct mlx5_fs_bulk *fs_bulk, int bulk_len)
|
||||
{
|
||||
fs_bulk->bulk_len = bulk_len;
|
||||
}
|
||||
|
||||
void mlx5_fs_bulk_cleanup(struct mlx5_fs_bulk *fs_bulk)
|
||||
{
|
||||
kvfree(fs_bulk->bitmask);
|
||||
|
|
|
|||
|
|
@ -39,8 +39,9 @@ struct mlx5_fs_pool {
|
|||
int threshold;
|
||||
};
|
||||
|
||||
int mlx5_fs_bulk_init(struct mlx5_core_dev *dev, struct mlx5_fs_bulk *fs_bulk,
|
||||
int bulk_len);
|
||||
void mlx5_fs_bulk_init(struct mlx5_fs_bulk *fs_bulk, int bulk_len);
|
||||
int mlx5_fs_bulk_bitmap_alloc(struct mlx5_core_dev *dev,
|
||||
struct mlx5_fs_bulk *fs_bulk);
|
||||
void mlx5_fs_bulk_cleanup(struct mlx5_fs_bulk *fs_bulk);
|
||||
int mlx5_fs_bulk_get_free_amount(struct mlx5_fs_bulk *bulk);
|
||||
|
||||
|
|
|
|||
|
|
@ -121,7 +121,9 @@ mlx5_fs_hws_pr_bulk_create(struct mlx5_core_dev *dev, void *pool_ctx)
|
|||
if (!pr_bulk)
|
||||
return NULL;
|
||||
|
||||
if (mlx5_fs_bulk_init(dev, &pr_bulk->fs_bulk, bulk_len))
|
||||
mlx5_fs_bulk_init(&pr_bulk->fs_bulk, bulk_len);
|
||||
|
||||
if (mlx5_fs_bulk_bitmap_alloc(dev, &pr_bulk->fs_bulk))
|
||||
goto free_pr_bulk;
|
||||
|
||||
for (i = 0; i < bulk_len; i++) {
|
||||
|
|
@ -275,7 +277,9 @@ mlx5_fs_hws_mh_bulk_create(struct mlx5_core_dev *dev, void *pool_ctx)
|
|||
if (!mh_bulk)
|
||||
return NULL;
|
||||
|
||||
if (mlx5_fs_bulk_init(dev, &mh_bulk->fs_bulk, bulk_len))
|
||||
mlx5_fs_bulk_init(&mh_bulk->fs_bulk, bulk_len);
|
||||
|
||||
if (mlx5_fs_bulk_bitmap_alloc(dev, &mh_bulk->fs_bulk))
|
||||
goto free_mh_bulk;
|
||||
|
||||
for (int i = 0; i < bulk_len; i++) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user