]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5e: Register/unregister vport representors on interface attach/detach
authorSaeed Mahameed <saeedm@mellanox.com>
Wed, 22 Feb 2017 15:20:12 +0000 (17:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Mar 2017 11:56:54 +0000 (12:56 +0100)
[ Upstream commit 6f08a22c5fb2b9aefb8ecd8496758e7a677c1fde ]

Currently vport representors are added only on driver load and removed on
driver unload.  Apparently we forgot to handle them when we added the
seamless reset flow feature.  This caused to leave the representors
netdevs alive and active with open HW resources on pci shutdown and on
error reset flows.

To overcome this we move their handling to interface attach/detach, so
they would be cleaned up on shutdown and recreated on reset flows.

Fixes: 26e59d8077a3 ("net/mlx5e: Implement mlx5e interface attach/detach callbacks")
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Reviewed-by: Hadar Hen Zion <hadarh@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index f14ca3385fdd683b12f434e289cc8e264040c1ed..2b3573028944f9bfc2ada1fb1dbc4a970961cc48 100644 (file)
@@ -3940,6 +3940,19 @@ static void mlx5e_register_vport_rep(struct mlx5_core_dev *mdev)
        }
 }
 
+static void mlx5e_unregister_vport_rep(struct mlx5_core_dev *mdev)
+{
+       struct mlx5_eswitch *esw = mdev->priv.eswitch;
+       int total_vfs = MLX5_TOTAL_VPORTS(mdev);
+       int vport;
+
+       if (!MLX5_CAP_GEN(mdev, vport_group_manager))
+               return;
+
+       for (vport = 1; vport < total_vfs; vport++)
+               mlx5_eswitch_unregister_vport_rep(esw, vport);
+}
+
 void mlx5e_detach_netdev(struct mlx5_core_dev *mdev, struct net_device *netdev)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
@@ -3986,6 +3999,7 @@ static int mlx5e_attach(struct mlx5_core_dev *mdev, void *vpriv)
                return err;
        }
 
+       mlx5e_register_vport_rep(mdev);
        return 0;
 }
 
@@ -3997,6 +4011,7 @@ static void mlx5e_detach(struct mlx5_core_dev *mdev, void *vpriv)
        if (!netif_device_present(netdev))
                return;
 
+       mlx5e_unregister_vport_rep(mdev);
        mlx5e_detach_netdev(mdev, netdev);
        mlx5e_destroy_mdev_resources(mdev);
 }
@@ -4015,8 +4030,6 @@ static void *mlx5e_add(struct mlx5_core_dev *mdev)
        if (err)
                return NULL;
 
-       mlx5e_register_vport_rep(mdev);
-
        if (MLX5_CAP_GEN(mdev, vport_group_manager))
                ppriv = &esw->offloads.vport_reps[0];
 
@@ -4068,13 +4081,7 @@ void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, struct mlx5e_priv *priv)
 
 static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv)
 {
-       struct mlx5_eswitch *esw = mdev->priv.eswitch;
-       int total_vfs = MLX5_TOTAL_VPORTS(mdev);
        struct mlx5e_priv *priv = vpriv;
-       int vport;
-
-       for (vport = 1; vport < total_vfs; vport++)
-               mlx5_eswitch_unregister_vport_rep(esw, vport);
 
        unregister_netdev(priv->netdev);
        mlx5e_detach(mdev, vpriv);