Commit 58f71be5 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by David S. Miller

ipv6: refactor ip6_finish_output2()

Throw neigh checks in ip6_finish_output2() under a single slow path if,
so we don't have the overhead in the hot path.
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4b143ed7
...@@ -119,19 +119,21 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff * ...@@ -119,19 +119,21 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
rcu_read_lock_bh(); rcu_read_lock_bh();
nexthop = rt6_nexthop((struct rt6_info *)dst, daddr); nexthop = rt6_nexthop((struct rt6_info *)dst, daddr);
neigh = __ipv6_neigh_lookup_noref(dev, nexthop); neigh = __ipv6_neigh_lookup_noref(dev, nexthop);
if (unlikely(!neigh))
neigh = __neigh_create(&nd_tbl, nexthop, dev, false); if (unlikely(IS_ERR_OR_NULL(neigh))) {
if (!IS_ERR(neigh)) { if (unlikely(!neigh))
sock_confirm_neigh(skb, neigh); neigh = __neigh_create(&nd_tbl, nexthop, dev, false);
ret = neigh_output(neigh, skb, false); if (IS_ERR(neigh)) {
rcu_read_unlock_bh(); rcu_read_unlock_bh();
return ret; IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTNOROUTES);
kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL);
return -EINVAL;
}
} }
sock_confirm_neigh(skb, neigh);
ret = neigh_output(neigh, skb, false);
rcu_read_unlock_bh(); rcu_read_unlock_bh();
return ret;
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTNOROUTES);
kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL);
return -EINVAL;
} }
static int static int
......
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