Commit 7061eb8c authored by Lijun Pan's avatar Lijun Pan Committed by Jakub Kicinski

net: core: introduce __netdev_notify_peers

There are some use cases for netdev_notify_peers in the context
when rtnl lock is already held. Introduce lockless version
of netdev_notify_peers call to save the extra code to call
	call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, dev);
	call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev);
After that, convert netdev_notify_peers to call the new helper.
Suggested-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
Signed-off-by: default avatarLijun Pan <ljp@linux.ibm.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 322e53d1
...@@ -4547,6 +4547,7 @@ void __dev_set_rx_mode(struct net_device *dev); ...@@ -4547,6 +4547,7 @@ void __dev_set_rx_mode(struct net_device *dev);
int dev_set_promiscuity(struct net_device *dev, int inc); int dev_set_promiscuity(struct net_device *dev, int inc);
int dev_set_allmulti(struct net_device *dev, int inc); int dev_set_allmulti(struct net_device *dev, int inc);
void netdev_state_change(struct net_device *dev); void netdev_state_change(struct net_device *dev);
void __netdev_notify_peers(struct net_device *dev);
void netdev_notify_peers(struct net_device *dev); void netdev_notify_peers(struct net_device *dev);
void netdev_features_change(struct net_device *dev); void netdev_features_change(struct net_device *dev);
/* Load a device via the kmod */ /* Load a device via the kmod */
......
...@@ -1456,6 +1456,25 @@ void netdev_state_change(struct net_device *dev) ...@@ -1456,6 +1456,25 @@ void netdev_state_change(struct net_device *dev)
} }
EXPORT_SYMBOL(netdev_state_change); EXPORT_SYMBOL(netdev_state_change);
/**
* __netdev_notify_peers - notify network peers about existence of @dev,
* to be called when rtnl lock is already held.
* @dev: network device
*
* Generate traffic such that interested network peers are aware of
* @dev, such as by generating a gratuitous ARP. This may be used when
* a device wants to inform the rest of the network about some sort of
* reconfiguration such as a failover event or virtual machine
* migration.
*/
void __netdev_notify_peers(struct net_device *dev)
{
ASSERT_RTNL();
call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, dev);
call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev);
}
EXPORT_SYMBOL(__netdev_notify_peers);
/** /**
* netdev_notify_peers - notify network peers about existence of @dev * netdev_notify_peers - notify network peers about existence of @dev
* @dev: network device * @dev: network device
...@@ -1469,8 +1488,7 @@ EXPORT_SYMBOL(netdev_state_change); ...@@ -1469,8 +1488,7 @@ EXPORT_SYMBOL(netdev_state_change);
void netdev_notify_peers(struct net_device *dev) void netdev_notify_peers(struct net_device *dev)
{ {
rtnl_lock(); rtnl_lock();
call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, dev); __netdev_notify_peers(dev);
call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev);
rtnl_unlock(); rtnl_unlock();
} }
EXPORT_SYMBOL(netdev_notify_peers); EXPORT_SYMBOL(netdev_notify_peers);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment