[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <1466412800-18400-1-git-send-email-idosch@mellanox.com>
Date: Mon, 20 Jun 2016 11:53:20 +0300
From: Ido Schimmel <idosch@...lanox.com>
To: <netdev@...r.kernel.org>
CC: <davem@...emloft.net>, <jiri@...lanox.com>, <eladr@...lanox.com>,
<yotamg@...lanox.com>, <nogahf@...lanox.com>,
<ogerlitz@...lanox.com>, <lucien.xin@...il.com>,
Ido Schimmel <idosch@...lanox.com>
Subject: [PATCH net] team: Fix possible deadlock during team enslave
Both dev_uc_sync_multiple() and dev_mc_sync_multiple() require the
source device to be locked by netif_addr_lock_bh(), but this is missing
in team's enslave function, so add it.
This fixes the following lockdep warning:
Possible interrupt unsafe locking scenario:
CPU0 CPU1
---- ----
lock(_xmit_ETHER/1);
local_irq_disable();
lock(&(&mc->mca_lock)->rlock);
lock(&team_netdev_addr_lock_key);
<Interrupt>
lock(&(&mc->mca_lock)->rlock);
*** DEADLOCK ***
Fixes: cb41c997d444 ("team: team should sync the port's uc/mc addrs when add a port")
Signed-off-by: Jiri Pirko <jiri@...lanox.com>
Signed-off-by: Ido Schimmel <idosch@...lanox.com>
---
drivers/net/team/team.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index 2ace126..fdee772 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -1203,8 +1203,10 @@ static int team_port_add(struct team *team, struct net_device *port_dev)
goto err_dev_open;
}
+ netif_addr_lock_bh(dev);
dev_uc_sync_multiple(port_dev, dev);
dev_mc_sync_multiple(port_dev, dev);
+ netif_addr_unlock_bh(dev);
err = vlan_vids_add_by_dev(port_dev, dev);
if (err) {
--
2.8.2
Powered by blists - more mailing lists