Commit 4b4194c4 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

arp: RCU change in arp_solicit()

Avoid two atomic ops in arp_solicit()
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 59b80802
...@@ -333,11 +333,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) ...@@ -333,11 +333,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
struct net_device *dev = neigh->dev; struct net_device *dev = neigh->dev;
__be32 target = *(__be32*)neigh->primary_key; __be32 target = *(__be32*)neigh->primary_key;
int probes = atomic_read(&neigh->probes); int probes = atomic_read(&neigh->probes);
struct in_device *in_dev = in_dev_get(dev); struct in_device *in_dev;
if (!in_dev) rcu_read_lock();
in_dev = __in_dev_get_rcu(dev);
if (!in_dev) {
rcu_read_unlock();
return; return;
}
switch (IN_DEV_ARP_ANNOUNCE(in_dev)) { switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
default: default:
case 0: /* By default announce any local IP */ case 0: /* By default announce any local IP */
...@@ -358,9 +361,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) ...@@ -358,9 +361,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
case 2: /* Avoid secondary IPs, get a primary/preferred one */ case 2: /* Avoid secondary IPs, get a primary/preferred one */
break; break;
} }
rcu_read_unlock();
if (in_dev)
in_dev_put(in_dev);
if (!saddr) if (!saddr)
saddr = inet_select_addr(dev, target, RT_SCOPE_LINK); saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);
......
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