From: Vu Pham <vuhu...@mellanox.com>

In merged eswitch configuration, peer miss rule is setup for all
vports. If metadata is enabled, peer miss rule with metadata matching
will be configured instead of source port matching; however, some
vports that have not yet been enabled don't have default_metadata
setup and their default_metadata will be zero.

Hence, setup/cleanup default metadata for all vports when eswitch moves
in/out of offloads mode.

Fixes: 133dcfc577ea ("net/mlx5: E-Switch, Alloc and free unique metadata for 
match")
Signed-off-by: Vu Pham <vuhu...@mellanox.com>
Reviewed-by: Bodong Wang <bod...@nvidia.com>
Reviewed-by: Roi Dayan <r...@nvidia.com>
Reviewed-by: Mark Bloch <mbl...@nvidia.com>
Signed-off-by: Saeed Mahameed <sae...@nvidia.com>
---
 .../mellanox/mlx5/core/eswitch_offloads.c     | 51 +++++++++++++++----
 1 file changed, 42 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c 
b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 9c740ce73085..3321bb1f188d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -1923,19 +1923,49 @@ static void esw_offloads_vport_metadata_cleanup(struct 
mlx5_eswitch *esw,
        mlx5_esw_match_metadata_free(esw, vport->default_metadata);
 }
 
+static void esw_offloads_metadata_uninit(struct mlx5_eswitch *esw)
+{
+       struct mlx5_vport *vport;
+       int i;
+
+       if (!mlx5_eswitch_vport_match_metadata_enabled(esw))
+               return;
+
+       mlx5_esw_for_all_vports_reverse(esw, i, vport)
+               esw_offloads_vport_metadata_cleanup(esw, vport);
+}
+
+static int esw_offloads_metadata_init(struct mlx5_eswitch *esw)
+{
+       struct mlx5_vport *vport;
+       int err;
+       int i;
+
+       if (!mlx5_eswitch_vport_match_metadata_enabled(esw))
+               return 0;
+
+       mlx5_esw_for_all_vports(esw, i, vport) {
+               err = esw_offloads_vport_metadata_setup(esw, vport);
+               if (err)
+                       goto metadata_err;
+       }
+
+       return 0;
+
+metadata_err:
+       esw_offloads_metadata_uninit(esw);
+       return err;
+}
+
 int
 esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
                                     struct mlx5_vport *vport)
 {
        int err;
 
-       err = esw_offloads_vport_metadata_setup(esw, vport);
-       if (err)
-               goto metadata_err;
-
        err = esw_acl_ingress_ofld_setup(esw, vport);
        if (err)
-               goto ingress_err;
+               return err;
 
        if (mlx5_eswitch_is_vf_vport(esw, vport->vport)) {
                err = esw_acl_egress_ofld_setup(esw, vport);
@@ -1947,9 +1977,6 @@ esw_vport_create_offloads_acl_tables(struct mlx5_eswitch 
*esw,
 
 egress_err:
        esw_acl_ingress_ofld_cleanup(esw, vport);
-ingress_err:
-       esw_offloads_vport_metadata_cleanup(esw, vport);
-metadata_err:
        return err;
 }
 
@@ -1959,7 +1986,6 @@ esw_vport_destroy_offloads_acl_tables(struct mlx5_eswitch 
*esw,
 {
        esw_acl_egress_ofld_cleanup(vport);
        esw_acl_ingress_ofld_cleanup(esw, vport);
-       esw_offloads_vport_metadata_cleanup(esw, vport);
 }
 
 static int esw_create_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
@@ -2138,6 +2164,10 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
        if (esw_use_vport_metadata(esw))
                esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
 
+       err = esw_offloads_metadata_init(esw);
+       if (err)
+               goto err_metadata;
+
        err = esw_set_passing_vport_metadata(esw, true);
        if (err)
                goto err_vport_metadata;
@@ -2170,6 +2200,8 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
 err_steering_init:
        esw_set_passing_vport_metadata(esw, false);
 err_vport_metadata:
+       esw_offloads_metadata_uninit(esw);
+err_metadata:
        esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
        mlx5_rdma_disable_roce(esw->dev);
        mutex_destroy(&esw->offloads.termtbl_mutex);
@@ -2204,6 +2236,7 @@ void esw_offloads_disable(struct mlx5_eswitch *esw)
        esw_offloads_unload_rep(esw, MLX5_VPORT_UPLINK);
        esw_set_passing_vport_metadata(esw, false);
        esw_offloads_steering_cleanup(esw);
+       esw_offloads_metadata_uninit(esw);
        esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
        mlx5_rdma_disable_roce(esw->dev);
        mutex_destroy(&esw->offloads.termtbl_mutex);
-- 
2.26.2

Reply via email to