net/mlx5: Move ACL drop counters life cycle close to ACL lifecycle
authorParav Pandit <parav@mellanox.com>
Mon, 28 Oct 2019 23:35:19 +0000 (23:35 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 1 Nov 2019 21:40:26 +0000 (14:40 -0700)
It is better to create/destroy ACL related drop counters where the actual
drop rule ACLs are created/destroyed, so that ACL configuration is self
contained for ingress and egress.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Vu Pham <vuhuong@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

index 47555e2..0e51131 100644 (file)
@@ -1665,58 +1665,55 @@ static void esw_apply_vport_conf(struct mlx5_eswitch *esw,
                               flags);
 }
 
-static void esw_legacy_vport_create_drop_counters(struct mlx5_vport *vport)
+static int esw_vport_create_legacy_acl_tables(struct mlx5_eswitch *esw,
+                                             struct mlx5_vport *vport)
 {
-       struct mlx5_core_dev *dev = vport->dev;
+       int ret;
 
-       if (MLX5_CAP_ESW_INGRESS_ACL(dev, flow_counter)) {
-               vport->ingress.legacy.drop_counter = mlx5_fc_create(dev, false);
+       /* Only non manager vports need ACL in legacy mode */
+       if (mlx5_esw_is_manager_vport(esw, vport->vport))
+               return 0;
+
+       if (!mlx5_esw_is_manager_vport(esw, vport->vport) &&
+           MLX5_CAP_ESW_INGRESS_ACL(esw->dev, flow_counter)) {
+               vport->ingress.legacy.drop_counter = mlx5_fc_create(esw->dev, false);
                if (IS_ERR(vport->ingress.legacy.drop_counter)) {
-                       esw_warn(dev,
+                       esw_warn(esw->dev,
                                 "vport[%d] configure ingress drop rule counter failed\n",
                                 vport->vport);
                        vport->ingress.legacy.drop_counter = NULL;
                }
        }
 
-       if (MLX5_CAP_ESW_EGRESS_ACL(dev, flow_counter)) {
-               vport->egress.legacy.drop_counter = mlx5_fc_create(dev, false);
+       ret = esw_vport_ingress_config(esw, vport);
+       if (ret)
+               goto ingress_err;
+
+       if (!mlx5_esw_is_manager_vport(esw, vport->vport) &&
+           MLX5_CAP_ESW_EGRESS_ACL(esw->dev, flow_counter)) {
+               vport->egress.legacy.drop_counter = mlx5_fc_create(esw->dev, false);
                if (IS_ERR(vport->egress.legacy.drop_counter)) {
-                       esw_warn(dev,
+                       esw_warn(esw->dev,
                                 "vport[%d] configure egress drop rule counter failed\n",
                                 vport->vport);
                        vport->egress.legacy.drop_counter = NULL;
                }
        }
-}
-
-static void esw_legacy_vport_destroy_drop_counters(struct mlx5_vport *vport)
-{
-       struct mlx5_core_dev *dev = vport->dev;
-
-       if (vport->ingress.legacy.drop_counter)
-               mlx5_fc_destroy(dev, vport->ingress.legacy.drop_counter);
-       if (vport->egress.legacy.drop_counter)
-               mlx5_fc_destroy(dev, vport->egress.legacy.drop_counter);
-}
-
-static int esw_vport_create_legacy_acl_tables(struct mlx5_eswitch *esw,
-                                             struct mlx5_vport *vport)
-{
-       int ret;
-
-       /* Only non manager vports need ACL in legacy mode */
-       if (mlx5_esw_is_manager_vport(esw, vport->vport))
-               return 0;
-
-       ret = esw_vport_ingress_config(esw, vport);
-       if (ret)
-               return ret;
 
        ret = esw_vport_egress_config(esw, vport);
        if (ret)
-               esw_vport_disable_ingress_acl(esw, vport);
+               goto egress_err;
+
+       return 0;
 
+egress_err:
+       esw_vport_disable_ingress_acl(esw, vport);
+       mlx5_fc_destroy(esw->dev, vport->egress.legacy.drop_counter);
+       vport->egress.legacy.drop_counter = NULL;
+
+ingress_err:
+       mlx5_fc_destroy(esw->dev, vport->ingress.legacy.drop_counter);
+       vport->ingress.legacy.drop_counter = NULL;
        return ret;
 }
 
@@ -1737,8 +1734,12 @@ static void esw_vport_destroy_legacy_acl_tables(struct mlx5_eswitch *esw,
                return;
 
        esw_vport_disable_egress_acl(esw, vport);
+       mlx5_fc_destroy(esw->dev, vport->egress.legacy.drop_counter);
+       vport->egress.legacy.drop_counter = NULL;
+
        esw_vport_disable_ingress_acl(esw, vport);
-       esw_legacy_vport_destroy_drop_counters(vport);
+       mlx5_fc_destroy(esw->dev, vport->ingress.legacy.drop_counter);
+       vport->ingress.legacy.drop_counter = NULL;
 }
 
 static void esw_vport_cleanup_acl(struct mlx5_eswitch *esw,
@@ -1759,11 +1760,6 @@ static int esw_enable_vport(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
 
        esw_debug(esw->dev, "Enabling VPORT(%d)\n", vport_num);
 
-       /* Create steering drop counters for ingress and egress ACLs */
-       if (!mlx5_esw_is_manager_vport(esw, vport_num) &&
-           esw->mode == MLX5_ESWITCH_LEGACY)
-               esw_legacy_vport_create_drop_counters(vport);
-
        /* Restore old vport configuration */
        esw_apply_vport_conf(esw, vport);