]> git.dujemihanovic.xyz Git - linux.git/commitdiff
net/mlx5e: Fix vlan data lost during suspend flow
authorMoshe Shemesh <moshe@nvidia.com>
Sat, 2 Oct 2021 08:15:35 +0000 (11:15 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Wed, 20 Oct 2021 17:42:50 +0000 (10:42 -0700)
During suspend flow the driver calls mlx5e_destroy_vlan_table() which
does not only delete the vlans steering flow rules, but also frees the
data on currently active vlans, thus it is not restored during resume
flow.

This fix keeps the vlan data on suspend flow and frees it only on driver
remove flow.

Fixes: 6783f0a21a3c ("net/mlx5e: Dynamic alloc vlan table for netdev when needed")
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/fs.h
drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index 41684a6c44e9947f619842f665f210b3db6ce753..a88a1a48229f60f670ae455dd58f5d95152f13e0 100644 (file)
@@ -199,6 +199,9 @@ void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv);
 int mlx5e_create_flow_steering(struct mlx5e_priv *priv);
 void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv);
 
+int mlx5e_fs_init(struct mlx5e_priv *priv);
+void mlx5e_fs_cleanup(struct mlx5e_priv *priv);
+
 int mlx5e_add_vlan_trap(struct mlx5e_priv *priv, int  trap_id, int tir_num);
 void mlx5e_remove_vlan_trap(struct mlx5e_priv *priv);
 int mlx5e_add_mac_trap(struct mlx5e_priv *priv, int  trap_id, int tir_num);
index c06b4b938ae796807ad0a06a4b1978c0c757991f..d226cc5ab1d168a56692d9dc4824a5725ef7a09d 100644 (file)
@@ -1186,10 +1186,6 @@ static int mlx5e_create_vlan_table(struct mlx5e_priv *priv)
        struct mlx5e_flow_table *ft;
        int err;
 
-       priv->fs.vlan = kvzalloc(sizeof(*priv->fs.vlan), GFP_KERNEL);
-       if (!priv->fs.vlan)
-               return -ENOMEM;
-
        ft = &priv->fs.vlan->ft;
        ft->num_groups = 0;
 
@@ -1198,10 +1194,8 @@ static int mlx5e_create_vlan_table(struct mlx5e_priv *priv)
        ft_attr.prio = MLX5E_NIC_PRIO;
 
        ft->t = mlx5_create_flow_table(priv->fs.ns, &ft_attr);
-       if (IS_ERR(ft->t)) {
-               err = PTR_ERR(ft->t);
-               goto err_free_t;
-       }
+       if (IS_ERR(ft->t))
+               return PTR_ERR(ft->t);
 
        ft->g = kcalloc(MLX5E_NUM_VLAN_GROUPS, sizeof(*ft->g), GFP_KERNEL);
        if (!ft->g) {
@@ -1221,9 +1215,6 @@ err_free_g:
        kfree(ft->g);
 err_destroy_vlan_table:
        mlx5_destroy_flow_table(ft->t);
-err_free_t:
-       kvfree(priv->fs.vlan);
-       priv->fs.vlan = NULL;
 
        return err;
 }
@@ -1232,7 +1223,6 @@ static void mlx5e_destroy_vlan_table(struct mlx5e_priv *priv)
 {
        mlx5e_del_vlan_rules(priv);
        mlx5e_destroy_flow_table(&priv->fs.vlan->ft);
-       kvfree(priv->fs.vlan);
 }
 
 static void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv)
@@ -1351,3 +1341,17 @@ void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv)
        mlx5e_arfs_destroy_tables(priv);
        mlx5e_ethtool_cleanup_steering(priv);
 }
+
+int mlx5e_fs_init(struct mlx5e_priv *priv)
+{
+       priv->fs.vlan = kvzalloc(sizeof(*priv->fs.vlan), GFP_KERNEL);
+       if (!priv->fs.vlan)
+               return -ENOMEM;
+       return 0;
+}
+
+void mlx5e_fs_cleanup(struct mlx5e_priv *priv)
+{
+       kvfree(priv->fs.vlan);
+       priv->fs.vlan = NULL;
+}
index 09c8b71b186c72c7d6200c5b93762320a0bf16e8..41ef6eb70a5852e5b7df70b6646edace7a11ad9f 100644 (file)
@@ -4578,6 +4578,12 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,
 
        mlx5e_timestamp_init(priv);
 
+       err = mlx5e_fs_init(priv);
+       if (err) {
+               mlx5_core_err(mdev, "FS initialization failed, %d\n", err);
+               return err;
+       }
+
        err = mlx5e_ipsec_init(priv);
        if (err)
                mlx5_core_err(mdev, "IPSec initialization failed, %d\n", err);
@@ -4595,6 +4601,7 @@ static void mlx5e_nic_cleanup(struct mlx5e_priv *priv)
        mlx5e_health_destroy_reporters(priv);
        mlx5e_tls_cleanup(priv);
        mlx5e_ipsec_cleanup(priv);
+       mlx5e_fs_cleanup(priv);
 }
 
 static int mlx5e_init_nic_rx(struct mlx5e_priv *priv)