Commit d5634fee authored by Paul Blakey's avatar Paul Blakey Committed by Saeed Mahameed
Browse files

net/mlx5: Add a no-append flow insertion mode



If no-append flag is set, we will add a new FTE, instead of appending
the actions of the inserted rule when the same match already exists.

While here, move the has_flow_tag boolean indicator to be a flag too.

This patch doesn't change any functionality.

Signed-off-by: default avatarPaul Blakey <paulb@mellanox.com>
Reviewed-by: default avatarOr Gerlitz <ogerlitz@mellanmox.com>
Reviewed-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent e52c2802
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -2793,7 +2793,7 @@ static int parse_flow_attr(struct mlx5_core_dev *mdev, u32 *match_c,
			return -EINVAL;
			return -EINVAL;


		action->flow_tag = ib_spec->flow_tag.tag_id;
		action->flow_tag = ib_spec->flow_tag.tag_id;
		action->has_flow_tag = true;
		action->flags |= FLOW_ACT_HAS_TAG;
		break;
		break;
	case IB_FLOW_SPEC_ACTION_DROP:
	case IB_FLOW_SPEC_ACTION_DROP:
		if (FIELDS_NOT_SUPPORTED(ib_spec->drop,
		if (FIELDS_NOT_SUPPORTED(ib_spec->drop,
@@ -2886,7 +2886,7 @@ is_valid_esp_aes_gcm(struct mlx5_core_dev *mdev,
		return egress ? VALID_SPEC_INVALID : VALID_SPEC_NA;
		return egress ? VALID_SPEC_INVALID : VALID_SPEC_NA;


	return is_crypto && is_ipsec &&
	return is_crypto && is_ipsec &&
		(!egress || (!is_drop && !flow_act->has_flow_tag)) ?
		(!egress || (!is_drop && !(flow_act->flags & FLOW_ACT_HAS_TAG))) ?
		VALID_SPEC_VALID : VALID_SPEC_INVALID;
		VALID_SPEC_VALID : VALID_SPEC_INVALID;
}
}


@@ -3349,7 +3349,7 @@ static struct mlx5_ib_flow_handler *_create_flow_rule(struct mlx5_ib_dev *dev,
					MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;
					MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;
	}
	}


	if (flow_act.has_flow_tag &&
	if ((flow_act.flags & FLOW_ACT_HAS_TAG)  &&
	    (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||
	    (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||
	     flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT)) {
	     flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT)) {
		mlx5_ib_warn(dev, "Flow tag %u and attribute type %x isn't allowed in leftovers\n",
		mlx5_ib_warn(dev, "Flow tag %u and attribute type %x isn't allowed in leftovers\n",
+1 −1
Original line number Original line Diff line number Diff line
@@ -684,9 +684,9 @@ mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,
	struct mlx5_flow_destination dest[2] = {};
	struct mlx5_flow_destination dest[2] = {};
	struct mlx5_flow_act flow_act = {
	struct mlx5_flow_act flow_act = {
		.action = attr->action,
		.action = attr->action,
		.has_flow_tag = true,
		.flow_tag = attr->flow_tag,
		.flow_tag = attr->flow_tag,
		.reformat_id = 0,
		.reformat_id = 0,
		.flags    = FLOW_ACT_HAS_TAG,
	};
	};
	struct mlx5_fc *counter = NULL;
	struct mlx5_fc *counter = NULL;
	bool table_created = false;
	bool table_created = false;
+1 −1
Original line number Original line Diff line number Diff line
@@ -650,7 +650,7 @@ static bool mlx5_is_fpga_egress_ipsec_rule(struct mlx5_core_dev *dev,
	    (match_criteria_enable &
	    (match_criteria_enable &
	     ~(MLX5_MATCH_OUTER_HEADERS | MLX5_MATCH_MISC_PARAMETERS)) ||
	     ~(MLX5_MATCH_OUTER_HEADERS | MLX5_MATCH_MISC_PARAMETERS)) ||
	    (flow_act->action & ~(MLX5_FLOW_CONTEXT_ACTION_ENCRYPT | MLX5_FLOW_CONTEXT_ACTION_ALLOW)) ||
	    (flow_act->action & ~(MLX5_FLOW_CONTEXT_ACTION_ENCRYPT | MLX5_FLOW_CONTEXT_ACTION_ALLOW)) ||
	     flow_act->has_flow_tag)
	     (flow_act->flags & FLOW_ACT_HAS_TAG))
		return false;
		return false;


	return true;
	return true;
+8 −1
Original line number Original line Diff line number Diff line
@@ -1428,7 +1428,7 @@ static int check_conflicting_ftes(struct fs_fte *fte, const struct mlx5_flow_act
		return -EEXIST;
		return -EEXIST;
	}
	}


	if (flow_act->has_flow_tag &&
	if ((flow_act->flags & FLOW_ACT_HAS_TAG) &&
	    fte->action.flow_tag != flow_act->flow_tag) {
	    fte->action.flow_tag != flow_act->flow_tag) {
		mlx5_core_warn(get_dev(&fte->node),
		mlx5_core_warn(get_dev(&fte->node),
			       "FTE flow tag %u already exists with different flow tag %u\n",
			       "FTE flow tag %u already exists with different flow tag %u\n",
@@ -1628,6 +1628,8 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,


search_again_locked:
search_again_locked:
	version = matched_fgs_get_version(match_head);
	version = matched_fgs_get_version(match_head);
	if (flow_act->flags & FLOW_ACT_NO_APPEND)
		goto skip_search;
	/* Try to find a fg that already contains a matching fte */
	/* Try to find a fg that already contains a matching fte */
	list_for_each_entry(iter, match_head, list) {
	list_for_each_entry(iter, match_head, list) {
		struct fs_fte *fte_tmp;
		struct fs_fte *fte_tmp;
@@ -1644,6 +1646,11 @@ search_again_locked:
		return rule;
		return rule;
	}
	}


skip_search:
	/* No group with matching fte found, or we skipped the search.
	 * Try to add a new fte to any matching fg.
	 */

	/* Check the ft version, for case that new flow group
	/* Check the ft version, for case that new flow group
	 * was added while the fgs weren't locked
	 * was added while the fgs weren't locked
	 */
	 */
+11 −3
Original line number Original line Diff line number Diff line
@@ -158,20 +158,28 @@ struct mlx5_fs_vlan {


#define MLX5_FS_VLAN_DEPTH	2
#define MLX5_FS_VLAN_DEPTH	2


enum {
	FLOW_ACT_HAS_TAG   = BIT(0),
	FLOW_ACT_NO_APPEND = BIT(1),
};

struct mlx5_flow_act {
struct mlx5_flow_act {
	u32 action;
	u32 action;
	bool has_flow_tag;
	u32 flow_tag;
	u32 flow_tag;
	u32 reformat_id;
	u32 reformat_id;
	u32 modify_id;
	u32 modify_id;
	uintptr_t esp_id;
	uintptr_t esp_id;
	u32 flags;
	struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
	struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
	struct ib_counters *counters;
	struct ib_counters *counters;
};
};


#define MLX5_DECLARE_FLOW_ACT(name) \
#define MLX5_DECLARE_FLOW_ACT(name) \
	struct mlx5_flow_act name = {MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\
	struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\
				     MLX5_FS_DEFAULT_FLOW_TAG, 0, 0}
				      .flow_tag = MLX5_FS_DEFAULT_FLOW_TAG, \
				      .reformat_id = 0, \
				      .modify_id = 0, \
				      .flags =  0, }


/* Single destination per rule.
/* Single destination per rule.
 * Group ID is implied by the match criteria.
 * Group ID is implied by the match criteria.