You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
6.4 KiB
174 lines
6.4 KiB
From a56298693c73f43b0b603c702eeb66b4c80ba6fb Mon Sep 17 00:00:00 2001
|
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
|
Date: Tue, 19 May 2020 07:49:02 -0400
|
|
Subject: [PATCH 240/312] [netdrv] net/mlx5: E-Switch, Introduce global tables
|
|
|
|
Message-id: <20200519074934.6303-32-ahleihel@redhat.com>
|
|
Patchwork-id: 310534
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.3 BZ 1663246 31/63] net/mlx5: E-Switch, Introduce global tables
|
|
Bugzilla: 1790219 1663246
|
|
RH-Acked-by: Marcelo Leitner <mleitner@redhat.com>
|
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Ivan Vecera <ivecera@redhat.com>
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1663246
|
|
Bugzilla: http://bugzilla.redhat.com/1790219
|
|
Upstream: v5.7-rc1
|
|
|
|
commit d18296ffd9ccde82c82c220263fca2e76d5258be
|
|
Author: Paul Blakey <paulb@mellanox.com>
|
|
Date: Thu Mar 12 12:23:10 2020 +0200
|
|
|
|
net/mlx5: E-Switch, Introduce global tables
|
|
|
|
Currently, flow tables are automatically connected according to their
|
|
<chain,prio,level> tuple.
|
|
|
|
Introduce global tables which are flow tables that are detached from the
|
|
eswitch chains processing, and will be connected by explicitly referencing
|
|
them from multiple chains.
|
|
|
|
Add this new table type, and allow connecting them by refenece.
|
|
|
|
Signed-off-by: Paul Blakey <paulb@mellanox.com>
|
|
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
|
---
|
|
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 2 ++
|
|
.../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 18 +++++++++----
|
|
.../mellanox/mlx5/core/eswitch_offloads_chains.c | 30 ++++++++++++++++++++++
|
|
.../mellanox/mlx5/core/eswitch_offloads_chains.h | 6 +++++
|
|
4 files changed, 51 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
index ccb4f0f566ea..e7de5e8e5605 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
@@ -462,6 +462,8 @@ struct mlx5_esw_flow_attr {
|
|
u32 dest_chain;
|
|
#ifndef __GENKSYMS__
|
|
u32 flags;
|
|
+ struct mlx5_flow_table *fdb;
|
|
+ struct mlx5_flow_table *dest_ft;
|
|
#endif
|
|
struct mlx5e_tc_flow_parse_attr *parse_attr;
|
|
};
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
index da5730c8c3fb..e8d9a0bd943a 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
@@ -324,7 +324,12 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
|
if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
|
struct mlx5_flow_table *ft;
|
|
|
|
- if (attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH) {
|
|
+ if (attr->dest_ft) {
|
|
+ flow_act.flags |= FLOW_ACT_IGNORE_FLOW_LEVEL;
|
|
+ dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
|
|
+ dest[i].ft = attr->dest_ft;
|
|
+ i++;
|
|
+ } else if (attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH) {
|
|
flow_act.flags |= FLOW_ACT_IGNORE_FLOW_LEVEL;
|
|
dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
|
|
dest[i].ft = mlx5_esw_chains_get_tc_end_ft(esw);
|
|
@@ -378,8 +383,11 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
|
if (split) {
|
|
fdb = esw_vport_tbl_get(esw, attr);
|
|
} else {
|
|
- fdb = mlx5_esw_chains_get_table(esw, attr->chain, attr->prio,
|
|
- 0);
|
|
+ if (attr->chain || attr->prio)
|
|
+ fdb = mlx5_esw_chains_get_table(esw, attr->chain,
|
|
+ attr->prio, 0);
|
|
+ else
|
|
+ fdb = attr->fdb;
|
|
mlx5_eswitch_set_rule_source_port(esw, spec, attr);
|
|
}
|
|
if (IS_ERR(fdb)) {
|
|
@@ -402,7 +410,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
|
err_add_rule:
|
|
if (split)
|
|
esw_vport_tbl_put(esw, attr);
|
|
- else
|
|
+ else if (attr->chain || attr->prio)
|
|
mlx5_esw_chains_put_table(esw, attr->chain, attr->prio, 0);
|
|
err_esw_get:
|
|
if (!(attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH) && attr->dest_chain)
|
|
@@ -499,7 +507,7 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,
|
|
} else {
|
|
if (split)
|
|
esw_vport_tbl_put(esw, attr);
|
|
- else
|
|
+ else if (attr->chain || attr->prio)
|
|
mlx5_esw_chains_put_table(esw, attr->chain, attr->prio,
|
|
0);
|
|
if (attr->dest_chain)
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.c
|
|
index 12ca184cd795..6f62a326071a 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.c
|
|
@@ -719,6 +719,36 @@ mlx5_esw_chains_get_tc_end_ft(struct mlx5_eswitch *esw)
|
|
return tc_end_fdb(esw);
|
|
}
|
|
|
|
+struct mlx5_flow_table *
|
|
+mlx5_esw_chains_create_global_table(struct mlx5_eswitch *esw)
|
|
+{
|
|
+ int chain, prio, level, err;
|
|
+
|
|
+ if (!fdb_ignore_flow_level_supported(esw)) {
|
|
+ err = -EOPNOTSUPP;
|
|
+
|
|
+ esw_warn(esw->dev,
|
|
+ "Couldn't create global flow table, ignore_flow_level not supported.");
|
|
+ goto err_ignore;
|
|
+ }
|
|
+
|
|
+ chain = mlx5_esw_chains_get_chain_range(esw),
|
|
+ prio = mlx5_esw_chains_get_prio_range(esw);
|
|
+ level = mlx5_esw_chains_get_level_range(esw);
|
|
+
|
|
+ return mlx5_esw_chains_create_fdb_table(esw, chain, prio, level);
|
|
+
|
|
+err_ignore:
|
|
+ return ERR_PTR(err);
|
|
+}
|
|
+
|
|
+void
|
|
+mlx5_esw_chains_destroy_global_table(struct mlx5_eswitch *esw,
|
|
+ struct mlx5_flow_table *ft)
|
|
+{
|
|
+ mlx5_esw_chains_destroy_fdb_table(esw, ft);
|
|
+}
|
|
+
|
|
static int
|
|
mlx5_esw_chains_init(struct mlx5_eswitch *esw)
|
|
{
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.h
|
|
index e806d8de868e..c7bc609acb91 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_chains.h
|
|
@@ -25,6 +25,12 @@ mlx5_esw_chains_put_table(struct mlx5_eswitch *esw, u32 chain, u32 prio,
|
|
struct mlx5_flow_table *
|
|
mlx5_esw_chains_get_tc_end_ft(struct mlx5_eswitch *esw);
|
|
|
|
+struct mlx5_flow_table *
|
|
+mlx5_esw_chains_create_global_table(struct mlx5_eswitch *esw);
|
|
+void
|
|
+mlx5_esw_chains_destroy_global_table(struct mlx5_eswitch *esw,
|
|
+ struct mlx5_flow_table *ft);
|
|
+
|
|
int mlx5_esw_chains_create(struct mlx5_eswitch *esw);
|
|
void mlx5_esw_chains_destroy(struct mlx5_eswitch *esw);
|
|
|
|
--
|
|
2.13.6
|
|
|