Commit a30c8b90 authored by Mark Bloch's avatar Mark Bloch Committed by Saeed Mahameed

net/mlx5: fs, do proper bookkeeping for forward destinations

Keep track after destinations that are forward destinations.
When a forward destinations is removed from an FTE check if
the actions bits need to be updated.
Signed-off-by: default avatarMark Bloch <mbloch@nvidia.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 6510bc0d
...@@ -424,6 +424,16 @@ static bool is_fwd_next_action(u32 action) ...@@ -424,6 +424,16 @@ static bool is_fwd_next_action(u32 action)
MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS); MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS);
} }
static bool is_fwd_dest_type(enum mlx5_flow_destination_type type)
{
return type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM ||
type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE ||
type == MLX5_FLOW_DESTINATION_TYPE_UPLINK ||
type == MLX5_FLOW_DESTINATION_TYPE_VPORT ||
type == MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER ||
type == MLX5_FLOW_DESTINATION_TYPE_TIR;
}
static bool check_valid_spec(const struct mlx5_flow_spec *spec) static bool check_valid_spec(const struct mlx5_flow_spec *spec)
{ {
int i; int i;
...@@ -566,8 +576,13 @@ static void del_sw_hw_rule(struct fs_node *node) ...@@ -566,8 +576,13 @@ static void del_sw_hw_rule(struct fs_node *node)
goto out; goto out;
} }
if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) { if (is_fwd_dest_type(rule->dest_attr.type)) {
--fte->dests_size; --fte->dests_size;
--fte->fwd_dests;
if (!fte->fwd_dests)
fte->action.action &=
~MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
fte->modify_mask |= fte->modify_mask |=
BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST); BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST);
goto out; goto out;
...@@ -1367,6 +1382,9 @@ create_flow_handle(struct fs_fte *fte, ...@@ -1367,6 +1382,9 @@ create_flow_handle(struct fs_fte *fte,
if (dest) { if (dest) {
fte->dests_size++; fte->dests_size++;
if (is_fwd_dest_type(dest[i].type))
fte->fwd_dests++;
type = dest[i].type == type = dest[i].type ==
MLX5_FLOW_DESTINATION_TYPE_COUNTER; MLX5_FLOW_DESTINATION_TYPE_COUNTER;
*modify_mask |= type ? count : dst; *modify_mask |= type ? count : dst;
......
...@@ -226,6 +226,7 @@ struct fs_fte { ...@@ -226,6 +226,7 @@ struct fs_fte {
struct mlx5_fs_dr_rule fs_dr_rule; struct mlx5_fs_dr_rule fs_dr_rule;
u32 val[MLX5_ST_SZ_DW_MATCH_PARAM]; u32 val[MLX5_ST_SZ_DW_MATCH_PARAM];
u32 dests_size; u32 dests_size;
u32 fwd_dests;
u32 index; u32 index;
struct mlx5_flow_context flow_context; struct mlx5_flow_context flow_context;
struct mlx5_flow_act action; struct mlx5_flow_act action;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment