Commit 8d6c31bf authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by David S. Miller

ipv6: Avoid rt6_probe() taking writer lock in the fast path

The patch checks neigh->nud_state before acquiring the writer lock.
Note that rt6_probe() is only used in CONFIG_IPV6_ROUTER_PREF.

40 udpflood processes and a /64 gateway route are used.
The gateway has NUD_PERMANENT.  Each of them is run for 30s.
At the end, the total number of finished sendto():

Before: 55M
After: 95M
Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
CC: Julian Anastasov <ja@ssi.bg>
CC: YOSHIFUJI Hideaki <hideaki.yoshifuji@miraclelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 990edb42
...@@ -560,6 +560,9 @@ static void rt6_probe(struct rt6_info *rt) ...@@ -560,6 +560,9 @@ static void rt6_probe(struct rt6_info *rt)
rcu_read_lock_bh(); rcu_read_lock_bh();
neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
if (neigh) { if (neigh) {
if (neigh->nud_state & NUD_VALID)
goto out;
work = NULL; work = NULL;
write_lock(&neigh->lock); write_lock(&neigh->lock);
if (!(neigh->nud_state & NUD_VALID) && if (!(neigh->nud_state & NUD_VALID) &&
...@@ -583,6 +586,7 @@ static void rt6_probe(struct rt6_info *rt) ...@@ -583,6 +586,7 @@ static void rt6_probe(struct rt6_info *rt)
schedule_work(&work->work); schedule_work(&work->work);
} }
out:
rcu_read_unlock_bh(); rcu_read_unlock_bh();
} }
#else #else
......
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