Skip to content

Commit acd43fe

Browse files
committed
Merge branch 'mlx4-fixes'
Tariq Toukan says: ==================== mlx4_en fixes for 4.7-rc This small patchset includes two small fixes for mlx4_en driver. One allows a clean shutdown even when clients do not release their netdev reference. The other adds error return values to the VLAN VID add/kill functions. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 27777da + 9d76931 commit acd43fe

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -406,22 +406,26 @@ static int mlx4_en_vlan_rx_add_vid(struct net_device *dev,
406406
mutex_lock(&mdev->state_lock);
407407
if (mdev->device_up && priv->port_up) {
408408
err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
409-
if (err)
409+
if (err) {
410410
en_err(priv, "Failed configuring VLAN filter\n");
411+
goto out;
412+
}
411413
}
412-
if (mlx4_register_vlan(mdev->dev, priv->port, vid, &idx))
413-
en_dbg(HW, priv, "failed adding vlan %d\n", vid);
414-
mutex_unlock(&mdev->state_lock);
414+
err = mlx4_register_vlan(mdev->dev, priv->port, vid, &idx);
415+
if (err)
416+
en_dbg(HW, priv, "Failed adding vlan %d\n", vid);
415417

416-
return 0;
418+
out:
419+
mutex_unlock(&mdev->state_lock);
420+
return err;
417421
}
418422

419423
static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev,
420424
__be16 proto, u16 vid)
421425
{
422426
struct mlx4_en_priv *priv = netdev_priv(dev);
423427
struct mlx4_en_dev *mdev = priv->mdev;
424-
int err;
428+
int err = 0;
425429

426430
en_dbg(HW, priv, "Killing VID:%d\n", vid);
427431

@@ -438,7 +442,7 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev,
438442
}
439443
mutex_unlock(&mdev->state_lock);
440444

441-
return 0;
445+
return err;
442446
}
443447

444448
static void mlx4_en_u64_to_mac(unsigned char dst_mac[ETH_ALEN + 2], u64 src_mac)
@@ -2032,19 +2036,31 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
20322036
return -ENOMEM;
20332037
}
20342038

2039+
static void mlx4_en_shutdown(struct net_device *dev)
2040+
{
2041+
rtnl_lock();
2042+
netif_device_detach(dev);
2043+
mlx4_en_close(dev);
2044+
rtnl_unlock();
2045+
}
20352046

20362047
void mlx4_en_destroy_netdev(struct net_device *dev)
20372048
{
20382049
struct mlx4_en_priv *priv = netdev_priv(dev);
20392050
struct mlx4_en_dev *mdev = priv->mdev;
2051+
bool shutdown = mdev->dev->persist->interface_state &
2052+
MLX4_INTERFACE_STATE_SHUTDOWN;
20402053

20412054
en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
20422055

20432056
/* Unregister device - this will close the port if it was up */
20442057
if (priv->registered) {
20452058
devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
20462059
priv->port));
2047-
unregister_netdev(dev);
2060+
if (shutdown)
2061+
mlx4_en_shutdown(dev);
2062+
else
2063+
unregister_netdev(dev);
20482064
}
20492065

20502066
if (priv->allocated)
@@ -2069,7 +2085,8 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
20692085
kfree(priv->tx_ring);
20702086
kfree(priv->tx_cq);
20712087

2072-
free_netdev(dev);
2088+
if (!shutdown)
2089+
free_netdev(dev);
20732090
}
20742091

20752092
static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4135,8 +4135,11 @@ static void mlx4_shutdown(struct pci_dev *pdev)
41354135

41364136
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
41374137
mutex_lock(&persist->interface_state_mutex);
4138-
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
4138+
if (persist->interface_state & MLX4_INTERFACE_STATE_UP) {
4139+
/* Notify mlx4 clients that the kernel is being shut down */
4140+
persist->interface_state |= MLX4_INTERFACE_STATE_SHUTDOWN;
41394141
mlx4_unload_one(pdev);
4142+
}
41404143
mutex_unlock(&persist->interface_state_mutex);
41414144
}
41424145

include/linux/mlx4/device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ enum {
466466
enum {
467467
MLX4_INTERFACE_STATE_UP = 1 << 0,
468468
MLX4_INTERFACE_STATE_DELETION = 1 << 1,
469+
MLX4_INTERFACE_STATE_SHUTDOWN = 1 << 2,
469470
};
470471

471472
#define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \

0 commit comments

Comments
 (0)