Skip to content

Commit 83a5a6c

Browse files
Yan Burmandavem330
authored andcommitted
net/mlx4_en: Cleanup MAC resources on module unload or port stop
Make sure we cleanup all MAC related resources (entries in the port MAC table and steering rules) when stopping a port or when the driver is unloaded. The leak was introduced by commit 07cb4b0a "net/mlx4_en: Manage hash of MAC addresses per port". Signed-off-by: Yan Burman <yanb@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent bfa8ab4 commit 83a5a6c

1 file changed

Lines changed: 20 additions & 16 deletions

File tree

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

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -565,34 +565,38 @@ static void mlx4_en_put_qp(struct mlx4_en_priv *priv)
565565
struct mlx4_en_dev *mdev = priv->mdev;
566566
struct mlx4_dev *dev = mdev->dev;
567567
int qpn = priv->base_qpn;
568-
u64 mac = mlx4_en_mac_to_u64(priv->dev->dev_addr);
569-
570-
en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
571-
priv->dev->dev_addr);
572-
mlx4_unregister_mac(dev, priv->port, mac);
568+
u64 mac;
573569

574-
if (dev->caps.steering_mode != MLX4_STEERING_MODE_A0) {
570+
if (dev->caps.steering_mode == MLX4_STEERING_MODE_A0) {
571+
mac = mlx4_en_mac_to_u64(priv->dev->dev_addr);
572+
en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
573+
priv->dev->dev_addr);
574+
mlx4_unregister_mac(dev, priv->port, mac);
575+
} else {
575576
struct mlx4_mac_entry *entry;
576577
struct hlist_node *tmp;
577578
struct hlist_head *bucket;
578-
unsigned int mac_hash;
579+
unsigned int i;
579580

580-
mac_hash = priv->dev->dev_addr[MLX4_EN_MAC_HASH_IDX];
581-
bucket = &priv->mac_hash[mac_hash];
582-
hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
583-
if (ether_addr_equal_64bits(entry->mac,
584-
priv->dev->dev_addr)) {
585-
en_dbg(DRV, priv, "Releasing qp: port %d, MAC %pM, qpn %d\n",
586-
priv->port, priv->dev->dev_addr, qpn);
581+
for (i = 0; i < MLX4_EN_MAC_HASH_SIZE; ++i) {
582+
bucket = &priv->mac_hash[i];
583+
hlist_for_each_entry_safe(entry, tmp, bucket, hlist) {
584+
mac = mlx4_en_mac_to_u64(entry->mac);
585+
en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n",
586+
entry->mac);
587587
mlx4_en_uc_steer_release(priv, entry->mac,
588588
qpn, entry->reg_id);
589-
mlx4_qp_release_range(dev, qpn, 1);
590589

590+
mlx4_unregister_mac(dev, priv->port, mac);
591591
hlist_del_rcu(&entry->hlist);
592592
kfree_rcu(entry, rcu);
593-
break;
594593
}
595594
}
595+
596+
en_dbg(DRV, priv, "Releasing qp: port %d, qpn %d\n",
597+
priv->port, qpn);
598+
mlx4_qp_release_range(dev, qpn, 1);
599+
priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC;
596600
}
597601
}
598602

0 commit comments

Comments
 (0)