Merge branch 'mlx5-misc-fixes-2025-09-22'
Tariq Toukan says: ==================== mlx5 misc fixes 2025-09-22 This patchset provides misc bug fixes from the team to the mlx5 Eth and core drivers. ==================== Link: https://patch.msgid.link/1758525094-816583-1-git-send-email-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -1466,6 +1466,7 @@ static void fec_set_block_stats(struct mlx5e_priv *priv,
|
||||
case MLX5E_FEC_RS_528_514:
|
||||
case MLX5E_FEC_RS_544_514:
|
||||
case MLX5E_FEC_LLRS_272_257_1:
|
||||
case MLX5E_FEC_RS_544_514_INTERLEAVED_QUAD:
|
||||
fec_set_rs_stats(fec_stats, out);
|
||||
return;
|
||||
case MLX5E_FEC_FIRECODE:
|
||||
|
||||
@@ -663,7 +663,7 @@ static void del_sw_hw_rule(struct fs_node *node)
|
||||
BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION) |
|
||||
BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_COUNTERS);
|
||||
fte->act_dests.action.action &= ~MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
||||
mlx5_fc_local_destroy(rule->dest_attr.counter);
|
||||
mlx5_fc_local_put(rule->dest_attr.counter);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -343,6 +343,7 @@ struct mlx5_fc {
|
||||
enum mlx5_fc_type type;
|
||||
struct mlx5_fc_bulk *bulk;
|
||||
struct mlx5_fc_cache cache;
|
||||
refcount_t fc_local_refcount;
|
||||
/* last{packets,bytes} are used for calculating deltas since last reading. */
|
||||
u64 lastpackets;
|
||||
u64 lastbytes;
|
||||
|
||||
@@ -562,17 +562,36 @@ mlx5_fc_local_create(u32 counter_id, u32 offset, u32 bulk_size)
|
||||
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);
|
||||
counter->bulk = fc_bulk;
|
||||
refcount_set(&counter->fc_local_refcount, 1);
|
||||
return counter;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_fc_local_create);
|
||||
|
||||
void mlx5_fc_local_destroy(struct mlx5_fc *counter)
|
||||
{
|
||||
if (!counter || counter->type != MLX5_FC_TYPE_LOCAL)
|
||||
return;
|
||||
|
||||
kfree(counter->bulk);
|
||||
kfree(counter);
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_fc_local_destroy);
|
||||
|
||||
void mlx5_fc_local_get(struct mlx5_fc *counter)
|
||||
{
|
||||
if (!counter || counter->type != MLX5_FC_TYPE_LOCAL)
|
||||
return;
|
||||
|
||||
refcount_inc(&counter->fc_local_refcount);
|
||||
}
|
||||
|
||||
void mlx5_fc_local_put(struct mlx5_fc *counter)
|
||||
{
|
||||
if (!counter || counter->type != MLX5_FC_TYPE_LOCAL)
|
||||
return;
|
||||
|
||||
if (!refcount_dec_and_test(&counter->fc_local_refcount))
|
||||
return;
|
||||
|
||||
mlx5_fc_local_destroy(counter);
|
||||
}
|
||||
|
||||
@@ -1360,7 +1360,7 @@ free_action:
|
||||
struct mlx5hws_action *
|
||||
mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx, size_t num_dest,
|
||||
struct mlx5hws_action_dest_attr *dests,
|
||||
bool ignore_flow_level, u32 flags)
|
||||
u32 flags)
|
||||
{
|
||||
struct mlx5hws_cmd_set_fte_dest *dest_list = NULL;
|
||||
struct mlx5hws_cmd_ft_create_attr ft_attr = {0};
|
||||
@@ -1397,7 +1397,7 @@ mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx, size_t num_dest,
|
||||
MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
|
||||
dest_list[i].destination_id = dests[i].dest->dest_obj.obj_id;
|
||||
fte_attr.action_flags |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
|
||||
fte_attr.ignore_flow_level = ignore_flow_level;
|
||||
fte_attr.ignore_flow_level = 1;
|
||||
if (dests[i].is_wire_ft)
|
||||
last_dest_idx = i;
|
||||
break;
|
||||
|
||||
@@ -572,12 +572,12 @@ static void mlx5_fs_put_dest_action_sampler(struct mlx5_fs_hws_context *fs_ctx,
|
||||
static struct mlx5hws_action *
|
||||
mlx5_fs_create_action_dest_array(struct mlx5hws_context *ctx,
|
||||
struct mlx5hws_action_dest_attr *dests,
|
||||
u32 num_of_dests, bool ignore_flow_level)
|
||||
u32 num_of_dests)
|
||||
{
|
||||
u32 flags = MLX5HWS_ACTION_FLAG_HWS_FDB | MLX5HWS_ACTION_FLAG_SHARED;
|
||||
|
||||
return mlx5hws_action_create_dest_array(ctx, num_of_dests, dests,
|
||||
ignore_flow_level, flags);
|
||||
flags);
|
||||
}
|
||||
|
||||
static struct mlx5hws_action *
|
||||
@@ -1014,19 +1014,14 @@ static int mlx5_fs_fte_get_hws_actions(struct mlx5_flow_root_namespace *ns,
|
||||
}
|
||||
(*ractions)[num_actions++].action = dest_actions->dest;
|
||||
} else if (num_dest_actions > 1) {
|
||||
bool ignore_flow_level;
|
||||
|
||||
if (num_actions == MLX5_FLOW_CONTEXT_ACTION_MAX ||
|
||||
num_fs_actions == MLX5_FLOW_CONTEXT_ACTION_MAX) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto free_actions;
|
||||
}
|
||||
ignore_flow_level =
|
||||
!!(fte_action->flags & FLOW_ACT_IGNORE_FLOW_LEVEL);
|
||||
tmp_action =
|
||||
mlx5_fs_create_action_dest_array(ctx, dest_actions,
|
||||
num_dest_actions,
|
||||
ignore_flow_level);
|
||||
num_dest_actions);
|
||||
if (!tmp_action) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto free_actions;
|
||||
|
||||
@@ -407,15 +407,21 @@ struct mlx5hws_action *mlx5_fc_get_hws_action(struct mlx5hws_context *ctx,
|
||||
{
|
||||
struct mlx5_fs_hws_create_action_ctx create_ctx;
|
||||
struct mlx5_fc_bulk *fc_bulk = counter->bulk;
|
||||
struct mlx5hws_action *hws_action;
|
||||
|
||||
create_ctx.hws_ctx = ctx;
|
||||
create_ctx.id = fc_bulk->base_id;
|
||||
create_ctx.actions_type = MLX5HWS_ACTION_TYP_CTR;
|
||||
|
||||
return mlx5_fs_get_hws_action(&fc_bulk->hws_data, &create_ctx);
|
||||
mlx5_fc_local_get(counter);
|
||||
hws_action = mlx5_fs_get_hws_action(&fc_bulk->hws_data, &create_ctx);
|
||||
if (!hws_action)
|
||||
mlx5_fc_local_put(counter);
|
||||
return hws_action;
|
||||
}
|
||||
|
||||
void mlx5_fc_put_hws_action(struct mlx5_fc *counter)
|
||||
{
|
||||
mlx5_fs_put_hws_action(&counter->bulk->hws_data);
|
||||
mlx5_fc_local_put(counter);
|
||||
}
|
||||
|
||||
@@ -735,7 +735,6 @@ mlx5hws_action_create_push_vlan(struct mlx5hws_context *ctx, u32 flags);
|
||||
* @num_dest: The number of dests attributes.
|
||||
* @dests: The destination array. Each contains a destination action and can
|
||||
* have additional actions.
|
||||
* @ignore_flow_level: Whether to turn on 'ignore_flow_level' for this dest.
|
||||
* @flags: Action creation flags (enum mlx5hws_action_flags).
|
||||
*
|
||||
* Return: pointer to mlx5hws_action on success NULL otherwise.
|
||||
@@ -743,7 +742,7 @@ mlx5hws_action_create_push_vlan(struct mlx5hws_context *ctx, u32 flags);
|
||||
struct mlx5hws_action *
|
||||
mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx, size_t num_dest,
|
||||
struct mlx5hws_action_dest_attr *dests,
|
||||
bool ignore_flow_level, u32 flags);
|
||||
u32 flags);
|
||||
|
||||
/**
|
||||
* mlx5hws_action_create_insert_header - Create insert header action.
|
||||
|
||||
@@ -308,6 +308,8 @@ struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
|
||||
void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
|
||||
struct mlx5_fc *mlx5_fc_local_create(u32 counter_id, u32 offset, u32 bulk_size);
|
||||
void mlx5_fc_local_destroy(struct mlx5_fc *counter);
|
||||
void mlx5_fc_local_get(struct mlx5_fc *counter);
|
||||
void mlx5_fc_local_put(struct mlx5_fc *counter);
|
||||
u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter);
|
||||
void mlx5_fc_query_cached(struct mlx5_fc *counter,
|
||||
u64 *bytes, u64 *packets, u64 *lastuse);
|
||||
|
||||
Reference in New Issue
Block a user