diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 0a7e32578540..a620dfae1c82 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -2396,11 +2396,14 @@ void bond_loadbalance_arp_mon(struct work_struct *work) struct list_head *iter; int do_failover = 0; - read_lock(&bond->lock); - - if (!bond_has_slaves(bond)) + if (!rtnl_trylock()) goto re_arm; + if (!bond_has_slaves(bond)) { + rtnl_unlock(); + goto re_arm; + } + oldcurrent = bond->curr_active_slave; /* see if any of the previous devices are up now (i.e. they have * xmt and rcv traffic). the curr_active_slave does not come into @@ -2481,13 +2484,12 @@ void bond_loadbalance_arp_mon(struct work_struct *work) write_unlock_bh(&bond->curr_slave_lock); unblock_netpoll_tx(); } + rtnl_unlock(); re_arm: if (bond->params.arp_interval) queue_delayed_work(bond->wq, &bond->arp_work, msecs_to_jiffies(bond->params.arp_interval)); - - read_unlock(&bond->lock); } /*