On Sun, Jun 5, 2016 at 2:14 AM, <zyjzyj2...@gmail.com> wrote: > From: Zhu Yanjun <zyjzyj2...@gmail.com> > > > Signed-off-by: Zhu Yanjun <zyjzyj2...@gmail.com> > --- > drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > index 088c47c..cb19cbc 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > @@ -6840,7 +6840,7 @@ static void ixgbe_watchdog_link_is_up(struct > ixgbe_adapter *adapter) > netif_tx_wake_all_queues(adapter->netdev); > > /* enable any upper devices */ > - rtnl_lock(); > + rcu_read_lock(); > netdev_for_each_all_upper_dev_rcu(adapter->netdev, upper, iter) { > if (netif_is_macvlan(upper)) { > struct macvlan_dev *vlan = netdev_priv(upper); > @@ -6849,7 +6849,7 @@ static void ixgbe_watchdog_link_is_up(struct > ixgbe_adapter *adapter) > netif_tx_wake_all_queues(upper); > } > } > - rtnl_unlock(); > + rcu_read_unlock(); > > /* update the default user priority for VFs */ > ixgbe_update_default_up(adapter);
The rtnl_lock is being used to prevent any changes to the upper devices while the interface is going through and updating the Tx queue configuration on them. Without that lock you introduce possible bugs since you could have queues freed or added while this loop is in the middle of trying to update the state of it. As a general rule you use rcu_read_lock when you are only reading an RCU protected structure, you use rtnl_lock when you have to protect the system from any other changes while you are updating network configuration. In this case netif_tx_wake_all_queues changes the state of the upper device. The use of rtnl_lock here is intentional and it is best to just leave it as is unless you have some actual bug you are seeing. - Alex