net: TCP early demux cleanup
authorEric Dumazet <edumazet@google.com>
Sun, 29 Jul 2012 21:06:13 +0000 (21:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Jul 2012 21:53:21 +0000 (14:53 -0700)
early_demux() handlers should be called in RCU context, and as we
use skb_dst_set_noref(skb, dst), caller must not exit from RCU context
before dst use (skb_dst(skb)) or release (skb_drop(dst))

Therefore, rcu_read_lock()/rcu_read_unlock() pairs around
->early_demux() are confusing and not needed :

Protocol handlers are already in an RCU read lock section.
(__netif_receive_skb() does the rcu_read_lock() )

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_input.c
net/ipv6/ip6_input.c

index 981ff1eef28cc9a1b24b0b50f58caa32fbcdd0d1..f1395a6fb35fcbb2f49d3a19ce6d48dcf43e4e89 100644 (file)
@@ -325,14 +325,12 @@ static int ip_rcv_finish(struct sk_buff *skb)
                const struct net_protocol *ipprot;
                int protocol = iph->protocol;
 
-               rcu_read_lock();
                ipprot = rcu_dereference(inet_protos[protocol]);
                if (ipprot && ipprot->early_demux) {
                        ipprot->early_demux(skb);
                        /* must reload iph, skb->head might have changed */
                        iph = ip_hdr(skb);
                }
-               rcu_read_unlock();
        }
 
        /*
index 47975e363fcdec47ad3c12f5097688e839772167..a52d864d562b4067e8f70db9e0fabbafe76b7fea 100644 (file)
@@ -52,11 +52,9 @@ int ip6_rcv_finish(struct sk_buff *skb)
        if (sysctl_ip_early_demux && !skb_dst(skb)) {
                const struct inet6_protocol *ipprot;
 
-               rcu_read_lock();
                ipprot = rcu_dereference(inet6_protos[ipv6_hdr(skb)->nexthdr]);
                if (ipprot && ipprot->early_demux)
                        ipprot->early_demux(skb);
-               rcu_read_unlock();
        }
        if (!skb_dst(skb))
                ip6_route_input(skb);