Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7aafc8f authored by Eli Britstein's avatar Eli Britstein Committed by Saeed Mahameed
Browse files

net/mlx5: Add modify FTE helper function



Add modify FTE helper function and use it when deleting a rule, as a
pre-step towards consolidated FTE modification, with no functional
change.

Signed-off-by: default avatarEli Britstein <elibr@mellanox.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Reviewed-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 6237634d
Loading
Loading
Loading
Loading
+29 −21
Original line number Original line Diff line number Diff line
@@ -420,22 +420,37 @@ static void del_sw_flow_table(struct fs_node *node)
	kfree(ft);
	kfree(ft);
}
}


static void del_sw_hw_rule(struct fs_node *node)
static void modify_fte(struct fs_fte *fte)
{
{
	struct mlx5_flow_root_namespace *root;
	struct mlx5_flow_root_namespace *root;
	struct mlx5_flow_rule *rule;
	struct mlx5_flow_table *ft;
	struct mlx5_flow_table *ft;
	struct mlx5_flow_group *fg;
	struct mlx5_flow_group *fg;
	struct fs_fte *fte;
	struct mlx5_core_dev *dev;
	int modify_mask;
	struct mlx5_core_dev *dev = get_dev(node);
	int err;
	int err;
	bool update_fte = false;


	fs_get_obj(rule, node);
	if (!fte->modify_mask)
	fs_get_obj(fte, rule->node.parent);
		return;

	fs_get_obj(fg, fte->node.parent);
	fs_get_obj(fg, fte->node.parent);
	fs_get_obj(ft, fg->node.parent);
	fs_get_obj(ft, fg->node.parent);
	dev = get_dev(&fte->node);

	root = find_root(&ft->node);
	err = root->cmds->update_fte(dev, ft, fg->id, fte->modify_mask, fte);
	if (err)
		mlx5_core_warn(dev,
			       "%s can't del rule fg id=%d fte_index=%d\n",
			       __func__, fg->id, fte->index);
	fte->modify_mask = 0;
}

static void del_sw_hw_rule(struct fs_node *node)
{
	struct mlx5_flow_rule *rule;
	struct fs_fte *fte;

	fs_get_obj(rule, node);
	fs_get_obj(fte, rule->node.parent);
	trace_mlx5_fs_del_rule(rule);
	trace_mlx5_fs_del_rule(rule);
	if (rule->sw_action == MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO) {
	if (rule->sw_action == MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO) {
		mutex_lock(&rule->dest_attr.ft->lock);
		mutex_lock(&rule->dest_attr.ft->lock);
@@ -445,27 +460,20 @@ static void del_sw_hw_rule(struct fs_node *node)


	if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_COUNTER  &&
	if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_COUNTER  &&
	    --fte->dests_size) {
	    --fte->dests_size) {
		modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION) |
		fte->modify_mask |=
			BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION) |
			BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_COUNTERS);
			BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_COUNTERS);
		fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_COUNT;
		fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_COUNT;
		update_fte = true;
		goto out;
		goto out;
	}
	}


	if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
	if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
	    --fte->dests_size) {
	    --fte->dests_size) {
		modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST);
		fte->modify_mask |=
		update_fte = true;
			BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST);
	}
	}
out:
out:
	root = find_root(&ft->node);
	modify_fte(fte);
	if (update_fte && fte->dests_size) {
		err = root->cmds->update_fte(dev, ft, fg->id, modify_mask, fte);
		if (err)
			mlx5_core_warn(dev,
				       "%s can't del rule fg id=%d fte_index=%d\n",
				       __func__, fg->id, fte->index);
	}
	kfree(rule);
	kfree(rule);
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -172,6 +172,7 @@ struct fs_fte {
	enum fs_fte_status		status;
	enum fs_fte_status		status;
	struct mlx5_fc			*counter;
	struct mlx5_fc			*counter;
	struct rhash_head		hash;
	struct rhash_head		hash;
	int				modify_mask;
};
};


/* Type of children is mlx5_flow_table/namespace */
/* Type of children is mlx5_flow_table/namespace */