Commit 9d769311 authored by Eran Ben Elisha's avatar Eran Ben Elisha Committed by David S. Miller

net/mlx4_en: Avoid unregister_netdev at shutdown flow

This allows a clean shutdown, even if some netdev clients do not
release their reference from this netdev. It is enough to release
the HW resources only as the kernel is shutting down.

Fixes: 2ba5fbd6 ('net/mlx4_core: Handle AER flow properly')
Signed-off-by: default avatarEran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 93c098af
...@@ -2036,11 +2036,20 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) ...@@ -2036,11 +2036,20 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
return -ENOMEM; return -ENOMEM;
} }
static void mlx4_en_shutdown(struct net_device *dev)
{
rtnl_lock();
netif_device_detach(dev);
mlx4_en_close(dev);
rtnl_unlock();
}
void mlx4_en_destroy_netdev(struct net_device *dev) void mlx4_en_destroy_netdev(struct net_device *dev)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
bool shutdown = mdev->dev->persist->interface_state &
MLX4_INTERFACE_STATE_SHUTDOWN;
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
...@@ -2048,6 +2057,9 @@ void mlx4_en_destroy_netdev(struct net_device *dev) ...@@ -2048,6 +2057,9 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
if (priv->registered) { if (priv->registered) {
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev, devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
priv->port)); priv->port));
if (shutdown)
mlx4_en_shutdown(dev);
else
unregister_netdev(dev); unregister_netdev(dev);
} }
...@@ -2073,6 +2085,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev) ...@@ -2073,6 +2085,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
kfree(priv->tx_ring); kfree(priv->tx_ring);
kfree(priv->tx_cq); kfree(priv->tx_cq);
if (!shutdown)
free_netdev(dev); free_netdev(dev);
} }
......
...@@ -4135,8 +4135,11 @@ static void mlx4_shutdown(struct pci_dev *pdev) ...@@ -4135,8 +4135,11 @@ static void mlx4_shutdown(struct pci_dev *pdev)
mlx4_info(persist->dev, "mlx4_shutdown was called\n"); mlx4_info(persist->dev, "mlx4_shutdown was called\n");
mutex_lock(&persist->interface_state_mutex); mutex_lock(&persist->interface_state_mutex);
if (persist->interface_state & MLX4_INTERFACE_STATE_UP) if (persist->interface_state & MLX4_INTERFACE_STATE_UP) {
/* Notify mlx4 clients that the kernel is being shut down */
persist->interface_state |= MLX4_INTERFACE_STATE_SHUTDOWN;
mlx4_unload_one(pdev); mlx4_unload_one(pdev);
}
mutex_unlock(&persist->interface_state_mutex); mutex_unlock(&persist->interface_state_mutex);
} }
......
...@@ -466,6 +466,7 @@ enum { ...@@ -466,6 +466,7 @@ enum {
enum { enum {
MLX4_INTERFACE_STATE_UP = 1 << 0, MLX4_INTERFACE_STATE_UP = 1 << 0,
MLX4_INTERFACE_STATE_DELETION = 1 << 1, MLX4_INTERFACE_STATE_DELETION = 1 << 1,
MLX4_INTERFACE_STATE_SHUTDOWN = 1 << 2,
}; };
#define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \ #define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment