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

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
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -119,20 +119,22 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
	rcu_read_lock_bh();
	nexthop = rt6_nexthop((struct rt6_info *)dst, daddr);
	neigh = __ipv6_neigh_lookup_noref(dev, nexthop);

	if (unlikely(IS_ERR_OR_NULL(neigh))) {
		if (unlikely(!neigh))
			neigh = __neigh_create(&nd_tbl, nexthop, dev, false);
	if (!IS_ERR(neigh)) {
		sock_confirm_neigh(skb, neigh);
		ret = neigh_output(neigh, skb, false);
		if (IS_ERR(neigh)) {
			rcu_read_unlock_bh();
		return ret;
	}
	rcu_read_unlock_bh();

			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();
	return ret;
}

static int
ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk,