]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net/mlx5: E-Switch, Setup all vports' metadata to support peer miss rule
authorVu Pham <vuhuong@mellanox.com>
Fri, 22 May 2020 18:48:38 +0000 (11:48 -0700)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 15 Sep 2020 18:59:52 +0000 (11:59 -0700)
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 <vuhuong@mellanox.com>
Reviewed-by: Bodong Wang <bodong@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 9c740ce73085f57e1703c7ea201aa3ad1e8060a9..3321bb1f188d4b2ecdf474631832e126968c168a 100644 (file)
@@ -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 @@ err_uplink:
 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);