Message ID | 1437757063-1186401-3-git-send-email-kafai@fb.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Hi, Martin KaFai Lau wrote: > 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 I think it is better to describe why it is okay without any locks. --yoshfuji > > Signed-off-by: Martin 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> > --- > net/ipv6/route.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/net/ipv6/route.c b/net/ipv6/route.c > index 6d503db..76dcff8 100644 > --- a/net/ipv6/route.c > +++ b/net/ipv6/route.c > @@ -560,6 +560,9 @@ static void rt6_probe(struct rt6_info *rt) > rcu_read_lock_bh(); > neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); > if (neigh) { > + if (neigh->nud_state & NUD_VALID) > + goto out; > + > work = NULL; > write_lock(&neigh->lock); > if (!(neigh->nud_state & NUD_VALID) && > @@ -583,6 +586,7 @@ static void rt6_probe(struct rt6_info *rt) > schedule_work(&work->work); > } > > +out: > rcu_read_unlock_bh(); > } > #else >
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 6d503db..76dcff8 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -560,6 +560,9 @@ static void rt6_probe(struct rt6_info *rt) rcu_read_lock_bh(); neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); if (neigh) { + if (neigh->nud_state & NUD_VALID) + goto out; + work = NULL; write_lock(&neigh->lock); if (!(neigh->nud_state & NUD_VALID) && @@ -583,6 +586,7 @@ static void rt6_probe(struct rt6_info *rt) schedule_work(&work->work); } +out: rcu_read_unlock_bh(); } #else
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: Martin 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> --- net/ipv6/route.c | 4 ++++ 1 file changed, 4 insertions(+)