Skip to content

Commit b782607

Browse files
paravmellanoxSaeed Mahameed
authored andcommitted
net/mlx5e: E-switch, Fix Ingress ACL groups in switchdev mode for prio tag
In cited commit, when prio tag mode is enabled, FTE creation fails due to missing group with valid match criteria. Hence, (a) create prio tag group metadata_prio_tag_grp when prio tag is enabled with match criteria for vlan push FTE. (b) Rename metadata_grp to metadata_allmatch_grp to reflect its purpose. Also when priority tag is enabled, delete metadata settings after deleting ingress rules, which are using it. Tide up rest of the ingress config code for unnecessary labels. Fixes: 10652f3 ("net/mlx5: Refactor ingress acl configuration") Signed-off-by: Parav Pandit <[email protected]> Reviewed-by: Eli Britstein <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 3d7cada commit b782607

File tree

2 files changed

+93
-38
lines changed

2 files changed

+93
-38
lines changed

drivers/net/ethernet/mellanox/mlx5/core/eswitch.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,14 @@ struct vport_ingress {
8181
struct mlx5_fc *drop_counter;
8282
} legacy;
8383
struct {
84-
struct mlx5_flow_group *metadata_grp;
84+
/* Optional group to add an FTE to do internal priority
85+
* tagging on ingress packets.
86+
*/
87+
struct mlx5_flow_group *metadata_prio_tag_grp;
88+
/* Group to add default match-all FTE entry to tag ingress
89+
* packet with metadata.
90+
*/
91+
struct mlx5_flow_group *metadata_allmatch_grp;
8592
struct mlx5_modify_hdr *modify_metadata;
8693
struct mlx5_flow_handle *modify_metadata_rule;
8794
} offloads;

drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

Lines changed: 85 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ u16 mlx5_eswitch_get_prio_range(struct mlx5_eswitch *esw)
8888
return 1;
8989
}
9090

91+
static bool
92+
esw_check_ingress_prio_tag_enabled(const struct mlx5_eswitch *esw,
93+
const struct mlx5_vport *vport)
94+
{
95+
return (MLX5_CAP_GEN(esw->dev, prio_tag_required) &&
96+
mlx5_eswitch_is_vf_vport(esw, vport->vport));
97+
}
98+
9199
static void
92100
mlx5_eswitch_set_rule_source_port(struct mlx5_eswitch *esw,
93101
struct mlx5_flow_spec *spec,
@@ -1760,12 +1768,9 @@ static int esw_vport_ingress_prio_tag_config(struct mlx5_eswitch *esw,
17601768
* required, allow
17611769
* Unmatched traffic is allowed by default
17621770
*/
1763-
17641771
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
1765-
if (!spec) {
1766-
err = -ENOMEM;
1767-
goto out_no_mem;
1768-
}
1772+
if (!spec)
1773+
return -ENOMEM;
17691774

17701775
/* Untagged packets - push prio tag VLAN, allow */
17711776
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.cvlan_tag);
@@ -1791,14 +1796,9 @@ static int esw_vport_ingress_prio_tag_config(struct mlx5_eswitch *esw,
17911796
"vport[%d] configure ingress untagged allow rule, err(%d)\n",
17921797
vport->vport, err);
17931798
vport->ingress.allow_rule = NULL;
1794-
goto out;
17951799
}
17961800

1797-
out:
17981801
kvfree(spec);
1799-
out_no_mem:
1800-
if (err)
1801-
esw_vport_cleanup_ingress_rules(esw, vport);
18021802
return err;
18031803
}
18041804

@@ -1836,13 +1836,9 @@ static int esw_vport_add_ingress_acl_modify_metadata(struct mlx5_eswitch *esw,
18361836
esw_warn(esw->dev,
18371837
"failed to add setting metadata rule for vport %d ingress acl, err(%d)\n",
18381838
vport->vport, err);
1839+
mlx5_modify_header_dealloc(esw->dev, vport->ingress.offloads.modify_metadata);
18391840
vport->ingress.offloads.modify_metadata_rule = NULL;
1840-
goto out;
18411841
}
1842-
1843-
out:
1844-
if (err)
1845-
mlx5_modify_header_dealloc(esw->dev, vport->ingress.offloads.modify_metadata);
18461842
return err;
18471843
}
18481844

@@ -1862,50 +1858,103 @@ static int esw_vport_create_ingress_acl_group(struct mlx5_eswitch *esw,
18621858
{
18631859
int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
18641860
struct mlx5_flow_group *g;
1861+
void *match_criteria;
18651862
u32 *flow_group_in;
1863+
u32 flow_index = 0;
18661864
int ret = 0;
18671865

18681866
flow_group_in = kvzalloc(inlen, GFP_KERNEL);
18691867
if (!flow_group_in)
18701868
return -ENOMEM;
18711869

1872-
memset(flow_group_in, 0, inlen);
1873-
MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 0);
1874-
MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 0);
1870+
if (esw_check_ingress_prio_tag_enabled(esw, vport)) {
1871+
/* This group is to hold FTE to match untagged packets when prio_tag
1872+
* is enabled.
1873+
*/
1874+
memset(flow_group_in, 0, inlen);
18751875

1876-
g = mlx5_create_flow_group(vport->ingress.acl, flow_group_in);
1877-
if (IS_ERR(g)) {
1878-
ret = PTR_ERR(g);
1879-
esw_warn(esw->dev,
1880-
"Failed to create vport[%d] ingress metadata group, err(%d)\n",
1881-
vport->vport, ret);
1882-
goto grp_err;
1876+
match_criteria = MLX5_ADDR_OF(create_flow_group_in,
1877+
flow_group_in, match_criteria);
1878+
MLX5_SET(create_flow_group_in, flow_group_in,
1879+
match_criteria_enable, MLX5_MATCH_OUTER_HEADERS);
1880+
MLX5_SET_TO_ONES(fte_match_param, match_criteria, outer_headers.cvlan_tag);
1881+
MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, flow_index);
1882+
MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, flow_index);
1883+
1884+
g = mlx5_create_flow_group(vport->ingress.acl, flow_group_in);
1885+
if (IS_ERR(g)) {
1886+
ret = PTR_ERR(g);
1887+
esw_warn(esw->dev, "vport[%d] ingress create untagged flow group, err(%d)\n",
1888+
vport->vport, ret);
1889+
goto prio_tag_err;
1890+
}
1891+
vport->ingress.offloads.metadata_prio_tag_grp = g;
1892+
flow_index++;
1893+
}
1894+
1895+
if (mlx5_eswitch_vport_match_metadata_enabled(esw)) {
1896+
/* This group holds an FTE with no matches for add metadata for
1897+
* tagged packets, if prio-tag is enabled (as a fallthrough),
1898+
* or all traffic in case prio-tag is disabled.
1899+
*/
1900+
memset(flow_group_in, 0, inlen);
1901+
MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, flow_index);
1902+
MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, flow_index);
1903+
1904+
g = mlx5_create_flow_group(vport->ingress.acl, flow_group_in);
1905+
if (IS_ERR(g)) {
1906+
ret = PTR_ERR(g);
1907+
esw_warn(esw->dev, "vport[%d] ingress create drop flow group, err(%d)\n",
1908+
vport->vport, ret);
1909+
goto metadata_err;
1910+
}
1911+
vport->ingress.offloads.metadata_allmatch_grp = g;
1912+
}
1913+
1914+
kvfree(flow_group_in);
1915+
return 0;
1916+
1917+
metadata_err:
1918+
if (!IS_ERR_OR_NULL(vport->ingress.offloads.metadata_prio_tag_grp)) {
1919+
mlx5_destroy_flow_group(vport->ingress.offloads.metadata_prio_tag_grp);
1920+
vport->ingress.offloads.metadata_prio_tag_grp = NULL;
18831921
}
1884-
vport->ingress.offloads.metadata_grp = g;
1885-
grp_err:
1922+
prio_tag_err:
18861923
kvfree(flow_group_in);
18871924
return ret;
18881925
}
18891926

18901927
static void esw_vport_destroy_ingress_acl_group(struct mlx5_vport *vport)
18911928
{
1892-
if (vport->ingress.offloads.metadata_grp) {
1893-
mlx5_destroy_flow_group(vport->ingress.offloads.metadata_grp);
1894-
vport->ingress.offloads.metadata_grp = NULL;
1929+
if (vport->ingress.offloads.metadata_allmatch_grp) {
1930+
mlx5_destroy_flow_group(vport->ingress.offloads.metadata_allmatch_grp);
1931+
vport->ingress.offloads.metadata_allmatch_grp = NULL;
1932+
}
1933+
1934+
if (vport->ingress.offloads.metadata_prio_tag_grp) {
1935+
mlx5_destroy_flow_group(vport->ingress.offloads.metadata_prio_tag_grp);
1936+
vport->ingress.offloads.metadata_prio_tag_grp = NULL;
18951937
}
18961938
}
18971939

18981940
static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
18991941
struct mlx5_vport *vport)
19001942
{
1943+
int num_ftes = 0;
19011944
int err;
19021945

19031946
if (!mlx5_eswitch_vport_match_metadata_enabled(esw) &&
1904-
!MLX5_CAP_GEN(esw->dev, prio_tag_required))
1947+
!esw_check_ingress_prio_tag_enabled(esw, vport))
19051948
return 0;
19061949

19071950
esw_vport_cleanup_ingress_rules(esw, vport);
1908-
err = esw_vport_create_ingress_acl_table(esw, vport, 1);
1951+
1952+
if (mlx5_eswitch_vport_match_metadata_enabled(esw))
1953+
num_ftes++;
1954+
if (esw_check_ingress_prio_tag_enabled(esw, vport))
1955+
num_ftes++;
1956+
1957+
err = esw_vport_create_ingress_acl_table(esw, vport, num_ftes);
19091958
if (err) {
19101959
esw_warn(esw->dev,
19111960
"failed to enable ingress acl (%d) on vport[%d]\n",
@@ -1926,8 +1975,7 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
19261975
goto metadata_err;
19271976
}
19281977

1929-
if (MLX5_CAP_GEN(esw->dev, prio_tag_required) &&
1930-
mlx5_eswitch_is_vf_vport(esw, vport->vport)) {
1978+
if (esw_check_ingress_prio_tag_enabled(esw, vport)) {
19311979
err = esw_vport_ingress_prio_tag_config(esw, vport);
19321980
if (err)
19331981
goto prio_tag_err;
@@ -1937,7 +1985,6 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
19371985
prio_tag_err:
19381986
esw_vport_del_ingress_acl_modify_metadata(esw, vport);
19391987
metadata_err:
1940-
esw_vport_cleanup_ingress_rules(esw, vport);
19411988
esw_vport_destroy_ingress_acl_group(vport);
19421989
group_err:
19431990
esw_vport_destroy_ingress_acl_table(vport);
@@ -2008,8 +2055,9 @@ esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
20082055
if (mlx5_eswitch_is_vf_vport(esw, vport->vport)) {
20092056
err = esw_vport_egress_config(esw, vport);
20102057
if (err) {
2011-
esw_vport_del_ingress_acl_modify_metadata(esw, vport);
20122058
esw_vport_cleanup_ingress_rules(esw, vport);
2059+
esw_vport_del_ingress_acl_modify_metadata(esw, vport);
2060+
esw_vport_destroy_ingress_acl_group(vport);
20132061
esw_vport_destroy_ingress_acl_table(vport);
20142062
}
20152063
}
@@ -2021,8 +2069,8 @@ esw_vport_destroy_offloads_acl_tables(struct mlx5_eswitch *esw,
20212069
struct mlx5_vport *vport)
20222070
{
20232071
esw_vport_disable_egress_acl(esw, vport);
2024-
esw_vport_del_ingress_acl_modify_metadata(esw, vport);
20252072
esw_vport_cleanup_ingress_rules(esw, vport);
2073+
esw_vport_del_ingress_acl_modify_metadata(esw, vport);
20262074
esw_vport_destroy_ingress_acl_group(vport);
20272075
esw_vport_destroy_ingress_acl_table(vport);
20282076
}

0 commit comments

Comments
 (0)