net: RCU conversion of dev_getbyhwaddr() and arp_ioctl()
Le dimanche 05 décembre 2010 à 09:19 +0100, Eric Dumazet a écrit : > Hmm.. > > If somebody can explain why RTNL is held in arp_ioctl() (and therefore > in arp_req_delete()), we might first remove RTNL use in arp_ioctl() so > that your patch can be applied. > > Right now it is not good, because RTNL wont be necessarly held when you > are going to call arp_invalidate() ? While doing this analysis, I found a refcount bug in llc, I'll send a patch for net-2.6 Meanwhile, here is the patch for net-next-2.6 Your patch then can be applied after mine. Thanks [PATCH] net: RCU conversion of dev_getbyhwaddr() and arp_ioctl() dev_getbyhwaddr() was called under RTNL. Rename it to dev_getbyhwaddr_rcu() and change all its caller to now use RCU locking instead of RTNL. Change arp_ioctl() to use RCU instead of RTNL locking. Note: this fix a dev refcount bug in llc Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a2d4b65d47
commit
941666c2e3
@@ -743,34 +743,31 @@ struct net_device *dev_get_by_index(struct net *net, int ifindex)
|
||||
EXPORT_SYMBOL(dev_get_by_index);
|
||||
|
||||
/**
|
||||
* dev_getbyhwaddr - find a device by its hardware address
|
||||
* dev_getbyhwaddr_rcu - find a device by its hardware address
|
||||
* @net: the applicable net namespace
|
||||
* @type: media type of device
|
||||
* @ha: hardware address
|
||||
*
|
||||
* Search for an interface by MAC address. Returns NULL if the device
|
||||
* is not found or a pointer to the device. The caller must hold the
|
||||
* rtnl semaphore. The returned device has not had its ref count increased
|
||||
* is not found or a pointer to the device. The caller must hold RCU
|
||||
* The returned device has not had its ref count increased
|
||||
* and the caller must therefore be careful about locking
|
||||
*
|
||||
* BUGS:
|
||||
* If the API was consistent this would be __dev_get_by_hwaddr
|
||||
*/
|
||||
|
||||
struct net_device *dev_getbyhwaddr(struct net *net, unsigned short type, char *ha)
|
||||
struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
|
||||
const char *ha)
|
||||
{
|
||||
struct net_device *dev;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
for_each_netdev(net, dev)
|
||||
for_each_netdev_rcu(net, dev)
|
||||
if (dev->type == type &&
|
||||
!memcmp(dev->dev_addr, ha, dev->addr_len))
|
||||
return dev;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(dev_getbyhwaddr);
|
||||
EXPORT_SYMBOL(dev_getbyhwaddr_rcu);
|
||||
|
||||
struct net_device *__dev_getfirstbyhwtype(struct net *net, unsigned short type)
|
||||
{
|
||||
|
Reference in New Issue
Block a user