Skip to content

Commit 6f08a22

Browse files
Saeed Mahameeddavem330
authored andcommitted
net/mlx5e: Register/unregister vport representors on interface attach/detach
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: 26e59d8 ("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>
1 parent 18bcf74 commit 6f08a22

File tree

1 file changed

+15
-8
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+15
-8
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3970,6 +3970,19 @@ static void mlx5e_register_vport_rep(struct mlx5_core_dev *mdev)
39703970
}
39713971
}
39723972

3973+
static void mlx5e_unregister_vport_rep(struct mlx5_core_dev *mdev)
3974+
{
3975+
struct mlx5_eswitch *esw = mdev->priv.eswitch;
3976+
int total_vfs = MLX5_TOTAL_VPORTS(mdev);
3977+
int vport;
3978+
3979+
if (!MLX5_CAP_GEN(mdev, vport_group_manager))
3980+
return;
3981+
3982+
for (vport = 1; vport < total_vfs; vport++)
3983+
mlx5_eswitch_unregister_vport_rep(esw, vport);
3984+
}
3985+
39733986
void mlx5e_detach_netdev(struct mlx5_core_dev *mdev, struct net_device *netdev)
39743987
{
39753988
struct mlx5e_priv *priv = netdev_priv(netdev);
@@ -4016,6 +4029,7 @@ static int mlx5e_attach(struct mlx5_core_dev *mdev, void *vpriv)
40164029
return err;
40174030
}
40184031

4032+
mlx5e_register_vport_rep(mdev);
40194033
return 0;
40204034
}
40214035

@@ -4027,6 +4041,7 @@ static void mlx5e_detach(struct mlx5_core_dev *mdev, void *vpriv)
40274041
if (!netif_device_present(netdev))
40284042
return;
40294043

4044+
mlx5e_unregister_vport_rep(mdev);
40304045
mlx5e_detach_netdev(mdev, netdev);
40314046
mlx5e_destroy_mdev_resources(mdev);
40324047
}
@@ -4045,8 +4060,6 @@ static void *mlx5e_add(struct mlx5_core_dev *mdev)
40454060
if (err)
40464061
return NULL;
40474062

4048-
mlx5e_register_vport_rep(mdev);
4049-
40504063
if (MLX5_CAP_GEN(mdev, vport_group_manager))
40514064
ppriv = &esw->offloads.vport_reps[0];
40524065

@@ -4098,13 +4111,7 @@ void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, struct mlx5e_priv *priv)
40984111

40994112
static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv)
41004113
{
4101-
struct mlx5_eswitch *esw = mdev->priv.eswitch;
4102-
int total_vfs = MLX5_TOTAL_VPORTS(mdev);
41034114
struct mlx5e_priv *priv = vpriv;
4104-
int vport;
4105-
4106-
for (vport = 1; vport < total_vfs; vport++)
4107-
mlx5_eswitch_unregister_vport_rep(esw, vport);
41084115

41094116
unregister_netdev(priv->netdev);
41104117
mlx5e_detach(mdev, vpriv);

0 commit comments

Comments
 (0)