]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gro: remove rcu_read_lock/rcu_read_unlock from gro_complete handlers
authorEric Dumazet <edumazet@google.com>
Tue, 23 Nov 2021 22:56:08 +0000 (14:56 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 25 Nov 2021 01:21:42 +0000 (17:21 -0800)
All gro_complete() handlers are called from napi_gro_complete()
while rcu_read_lock() has been called.

There is no point stacking more rcu_read_lock()

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/geneve.c
net/8021q/vlan_core.c
net/ethernet/eth.c
net/ipv4/af_inet.c
net/ipv4/fou.c
net/ipv4/gre_offload.c
net/ipv4/udp_offload.c
net/ipv6/ip6_offload.c

index 9caff2e01d19751bbd4a05bf5e204a16dde8a779..c1fdd721a730d7122a84079e7a96e6902c14f1fe 100644 (file)
@@ -545,13 +545,10 @@ static int geneve_gro_complete(struct sock *sk, struct sk_buff *skb,
        gh_len = geneve_hlen(gh);
        type = gh->proto_type;
 
-       rcu_read_lock();
        ptype = gro_find_complete_by_type(type);
        if (ptype)
                err = ptype->callbacks.gro_complete(skb, nhoff + gh_len);
 
-       rcu_read_unlock();
-
        skb_set_inner_mac_header(skb, nhoff + gh_len);
 
        return err;
index 534eebb5a2e6d10b8ecd893f0ed5e1dc2113f036..acf8c791f3207bc86fc3d61bfde53e1857d43a28 100644 (file)
@@ -513,14 +513,12 @@ static int vlan_gro_complete(struct sk_buff *skb, int nhoff)
        struct packet_offload *ptype;
        int err = -ENOENT;
 
-       rcu_read_lock();
        ptype = gro_find_complete_by_type(type);
        if (ptype)
                err = INDIRECT_CALL_INET(ptype->callbacks.gro_complete,
                                         ipv6_gro_complete, inet_gro_complete,
                                         skb, nhoff + sizeof(*vhdr));
 
-       rcu_read_unlock();
        return err;
 }
 
index d4fa2f152efcbd7faf98ba4364e65cad8619ec1f..ebcc812735a4c13f104f5ed3e86b15fda4aef148 100644 (file)
@@ -466,14 +466,12 @@ int eth_gro_complete(struct sk_buff *skb, int nhoff)
        if (skb->encapsulation)
                skb_set_inner_mac_header(skb, nhoff);
 
-       rcu_read_lock();
        ptype = gro_find_complete_by_type(type);
        if (ptype != NULL)
                err = INDIRECT_CALL_INET(ptype->callbacks.gro_complete,
                                         ipv6_gro_complete, inet_gro_complete,
                                         skb, nhoff + sizeof(*eh));
 
-       rcu_read_unlock();
        return err;
 }
 EXPORT_SYMBOL(eth_gro_complete);
index de7d3a6748f56af261f9cc7e7fbededee0330b6b..04067b249bf344ec8adc6415471cf84a01501d09 100644 (file)
@@ -1612,10 +1612,9 @@ int inet_gro_complete(struct sk_buff *skb, int nhoff)
        csum_replace2(&iph->check, iph->tot_len, newlen);
        iph->tot_len = newlen;
 
-       rcu_read_lock();
        ops = rcu_dereference(inet_offloads[proto]);
        if (WARN_ON(!ops || !ops->callbacks.gro_complete))
-               goto out_unlock;
+               goto out;
 
        /* Only need to add sizeof(*iph) to get to the next hdr below
         * because any hdr with option will have been flushed in
@@ -1625,9 +1624,7 @@ int inet_gro_complete(struct sk_buff *skb, int nhoff)
                              tcp4_gro_complete, udp4_gro_complete,
                              skb, nhoff + sizeof(*iph));
 
-out_unlock:
-       rcu_read_unlock();
-
+out:
        return err;
 }
 
index 6ebc345e6001c2b76926576acd6377ea6abeefbe..0d085cc8d96cbd9cac0769fbb830791359a81c72 100644 (file)
@@ -266,19 +266,16 @@ static int fou_gro_complete(struct sock *sk, struct sk_buff *skb,
        const struct net_offload *ops;
        int err = -ENOSYS;
 
-       rcu_read_lock();
        offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
        ops = rcu_dereference(offloads[proto]);
        if (WARN_ON(!ops || !ops->callbacks.gro_complete))
-               goto out_unlock;
+               goto out;
 
        err = ops->callbacks.gro_complete(skb, nhoff);
 
        skb_set_inner_mac_header(skb, nhoff);
 
-out_unlock:
-       rcu_read_unlock();
-
+out:
        return err;
 }
 
@@ -480,18 +477,16 @@ static int gue_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
                return err;
        }
 
-       rcu_read_lock();
        offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
        ops = rcu_dereference(offloads[proto]);
        if (WARN_ON(!ops || !ops->callbacks.gro_complete))
-               goto out_unlock;
+               goto out;
 
        err = ops->callbacks.gro_complete(skb, nhoff + guehlen);
 
        skb_set_inner_mac_header(skb, nhoff + guehlen);
 
-out_unlock:
-       rcu_read_unlock();
+out:
        return err;
 }
 
index c6b5d327e3e14de1a0a77dbb6c53acced157bcfb..07073fa35205ef80882c854c6a7b3eebe746f365 100644 (file)
@@ -253,13 +253,10 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff)
        if (greh->flags & GRE_CSUM)
                grehlen += GRE_HEADER_SECTION;
 
-       rcu_read_lock();
        ptype = gro_find_complete_by_type(type);
        if (ptype)
                err = ptype->callbacks.gro_complete(skb, nhoff + grehlen);
 
-       rcu_read_unlock();
-
        skb_set_inner_mac_header(skb, nhoff + grehlen);
 
        return err;
index 3be5c083879d98a6c100b05635d0818c328ced31..6d1a4bec2614df4f8b9ec5e6c387ab154d1f8d89 100644 (file)
@@ -667,7 +667,6 @@ int udp_gro_complete(struct sk_buff *skb, int nhoff,
 
        uh->len = newlen;
 
-       rcu_read_lock();
        sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
                                udp4_lib_lookup_skb, skb, uh->source, uh->dest);
        if (sk && udp_sk(sk)->gro_complete) {
@@ -688,7 +687,6 @@ int udp_gro_complete(struct sk_buff *skb, int nhoff,
        } else {
                err = udp_gro_complete_segment(skb);
        }
-       rcu_read_unlock();
 
        if (skb->remcsum_offload)
                skb_shinfo(skb)->gso_type |= SKB_GSO_TUNNEL_REMCSUM;
index 67b9ba5e159c3a83207310d2d0b7a42557da895b..48674888f2dcb68aa5b4786b252e5ab5bad4b9ba 100644 (file)
@@ -327,18 +327,14 @@ INDIRECT_CALLABLE_SCOPE int ipv6_gro_complete(struct sk_buff *skb, int nhoff)
 
        iph->payload_len = htons(skb->len - nhoff - sizeof(*iph));
 
-       rcu_read_lock();
-
        nhoff += sizeof(*iph) + ipv6_exthdrs_len(iph, &ops);
        if (WARN_ON(!ops || !ops->callbacks.gro_complete))
-               goto out_unlock;
+               goto out;
 
        err = INDIRECT_CALL_L4(ops->callbacks.gro_complete, tcp6_gro_complete,
                               udp6_gro_complete, skb, nhoff);
 
-out_unlock:
-       rcu_read_unlock();
-
+out:
        return err;
 }