Commit 2fc8d112 authored by David S. Miller's avatar David S. Miller

Merge branch 'mlx4-fixes'

Tariq Toukan says:

====================
mlx4 bug fixes for 4.9

This patchset includes 2 bug fixes:
* In patch 1 we revert the commit that avoids invoking unregister_netdev
in shutdown flow, as it introduces netdev presence issues where
it can be accessed unsafely by ndo operations during the flow.
* Patch 2 is a simple fix for a variable uninitialization issue.

Series generated against net commit:
6998cc6e tipc: resolve connection flow control compatibility problem
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents faa1fa54 44b911e7
...@@ -2079,13 +2079,6 @@ static int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) ...@@ -2079,13 +2079,6 @@ static 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();
}
static int mlx4_en_copy_priv(struct mlx4_en_priv *dst, static int mlx4_en_copy_priv(struct mlx4_en_priv *dst,
struct mlx4_en_priv *src, struct mlx4_en_priv *src,
...@@ -2162,8 +2155,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev) ...@@ -2162,8 +2155,6 @@ 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);
...@@ -2171,10 +2162,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev) ...@@ -2171,10 +2162,7 @@ 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) unregister_netdev(dev);
mlx4_en_shutdown(dev);
else
unregister_netdev(dev);
} }
if (priv->allocated) if (priv->allocated)
...@@ -2203,8 +2191,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev) ...@@ -2203,8 +2191,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);
} }
static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
......
...@@ -4147,11 +4147,8 @@ static void mlx4_shutdown(struct pci_dev *pdev) ...@@ -4147,11 +4147,8 @@ 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);
} }
......
...@@ -1457,7 +1457,12 @@ EXPORT_SYMBOL_GPL(mlx4_multicast_detach); ...@@ -1457,7 +1457,12 @@ EXPORT_SYMBOL_GPL(mlx4_multicast_detach);
int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port, int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
u32 qpn, enum mlx4_net_trans_promisc_mode mode) u32 qpn, enum mlx4_net_trans_promisc_mode mode)
{ {
struct mlx4_net_trans_rule rule; struct mlx4_net_trans_rule rule = {
.queue_mode = MLX4_NET_TRANS_Q_FIFO,
.exclusive = 0,
.allow_loopback = 1,
};
u64 *regid_p; u64 *regid_p;
switch (mode) { switch (mode) {
......
...@@ -476,7 +476,6 @@ enum { ...@@ -476,7 +476,6 @@ 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