ipv6: add some unlikely()/likely() clauses in ip6_output.c
1) daddr is unlikely a multicast in ip6_finish_output2(). 2) ip6_finish_output_gso_slowpath_drop() should not be called often. 3) ip6_fragment() should not be called often. 4) opt is unlikely to be set. 5) ip6_xmit() and ip6_forward() mostly sends not too big packets. 6) Most __ip6_make_skb() calls are for UDP packets, not ICMPV6 ones. Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com> Link: https://patch.msgid.link/20260130210303.3888261-3-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1bc46dd209
commit
2855e49254
|
|
@ -80,7 +80,7 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
|
|||
|
||||
hdr = ipv6_hdr(skb);
|
||||
daddr = &hdr->daddr;
|
||||
if (ipv6_addr_is_multicast(daddr)) {
|
||||
if (unlikely(ipv6_addr_is_multicast(daddr))) {
|
||||
if (!(dev->flags & IFF_LOOPBACK) && sk_mc_loop(sk) &&
|
||||
((mroute6_is_socket(net, skb) &&
|
||||
!(IP6CB(skb)->flags & IP6SKB_FORWARDED)) ||
|
||||
|
|
@ -179,8 +179,8 @@ ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk,
|
|||
static int ip6_finish_output_gso(struct net *net, struct sock *sk,
|
||||
struct sk_buff *skb, unsigned int mtu)
|
||||
{
|
||||
if (!(IP6CB(skb)->flags & IP6SKB_FAKEJUMBO) &&
|
||||
!skb_gso_validate_network_len(skb, mtu))
|
||||
if (unlikely(!(IP6CB(skb)->flags & IP6SKB_FAKEJUMBO) &&
|
||||
!skb_gso_validate_network_len(skb, mtu)))
|
||||
return ip6_finish_output_gso_slowpath_drop(net, sk, skb, mtu);
|
||||
|
||||
return ip6_finish_output2(net, sk, skb);
|
||||
|
|
@ -202,8 +202,8 @@ static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff
|
|||
if (skb_is_gso(skb))
|
||||
return ip6_finish_output_gso(net, sk, skb, mtu);
|
||||
|
||||
if (skb->len > mtu ||
|
||||
(IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size))
|
||||
if (unlikely(skb->len > mtu ||
|
||||
(IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size)))
|
||||
return ip6_fragment(net, sk, skb, ip6_finish_output2);
|
||||
|
||||
return ip6_finish_output2(net, sk, skb);
|
||||
|
|
@ -301,7 +301,7 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
|
|||
}
|
||||
}
|
||||
|
||||
if (opt) {
|
||||
if (unlikely(opt)) {
|
||||
seg_len += opt->opt_nflen + opt->opt_flen;
|
||||
|
||||
if (opt->opt_flen)
|
||||
|
|
@ -354,7 +354,7 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
|
|||
skb->mark = mark;
|
||||
|
||||
mtu = dst_mtu(dst);
|
||||
if ((skb->len <= mtu) || skb->ignore_df || skb_is_gso(skb)) {
|
||||
if (likely((skb->len <= mtu) || skb->ignore_df || skb_is_gso(skb))) {
|
||||
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTREQUESTS);
|
||||
|
||||
/* if egress device is enslaved to an L3 master device pass the
|
||||
|
|
@ -654,7 +654,7 @@ int ip6_forward(struct sk_buff *skb)
|
|||
if (mtu < IPV6_MIN_MTU)
|
||||
mtu = IPV6_MIN_MTU;
|
||||
|
||||
if (ip6_pkt_too_big(skb, mtu)) {
|
||||
if (unlikely(ip6_pkt_too_big(skb, mtu))) {
|
||||
/* Again, force OUTPUT device used as source address */
|
||||
skb->dev = dev;
|
||||
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
|
||||
|
|
@ -1368,7 +1368,7 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,
|
|||
/*
|
||||
* setup for corking
|
||||
*/
|
||||
if (opt) {
|
||||
if (unlikely(opt)) {
|
||||
if (WARN_ON(v6_cork->opt))
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -1885,7 +1885,7 @@ static void ip6_cork_steal_dst(struct sk_buff *skb, struct inet_cork_full *cork)
|
|||
static void ip6_cork_release(struct inet_cork_full *cork,
|
||||
struct inet6_cork *v6_cork)
|
||||
{
|
||||
if (v6_cork->opt) {
|
||||
if (unlikely(v6_cork->opt)) {
|
||||
struct ipv6_txoptions *opt = v6_cork->opt;
|
||||
|
||||
kfree(opt->dst0opt);
|
||||
|
|
@ -1941,7 +1941,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,
|
|||
__skb_pull(skb, skb_network_header_len(skb));
|
||||
|
||||
final_dst = &fl6->daddr;
|
||||
if (opt) {
|
||||
if (unlikely(opt)) {
|
||||
if (opt->opt_flen)
|
||||
proto = ipv6_push_frag_opts(skb, opt, proto);
|
||||
if (opt->opt_nflen)
|
||||
|
|
@ -1969,7 +1969,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,
|
|||
|
||||
ip6_cork_steal_dst(skb, cork);
|
||||
IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS);
|
||||
if (proto == IPPROTO_ICMPV6) {
|
||||
if (unlikely(proto == IPPROTO_ICMPV6)) {
|
||||
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
|
||||
u8 icmp6_type;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue