mirror of https://gitee.com/openkylin/linux.git
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: Paul Blakey <paulb@mellanox.com> Reviewed-by: Or Gerlitz <ogerlitz@mellanmox.com> Reviewed-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
e52c280240
commit
d5634fee24
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
|
||||||
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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue