Message ID | 1402614786.3645.500.camel@edumazet-glaptop2.roam.corp.google.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Thu, 12 Jun 2014 16:13:06 -0700 > From: Eric Dumazet <edumazet@google.com> > > Its too easy to add thousand of UDP sockets on a particular bucket, > and slow down an innocent multicast receiver. > > Early demux is supposed to be an optimization, we should avoid spending > too much time in it. > > It is interesting to note __udp4_lib_demux_lookup() only tries to > match first socket in the chain. > > 10 is the threshold we already have in __udp4_lib_lookup() to switch > to secondary hash. > > Fixes: 421b3885bf6d5 ("udp: ipv4: Add udp early demux") > Signed-off-by: Eric Dumazet <edumazet@google.com> > Reported-by: David Held <drheld@google.com> Applied and queued up for -stable, thanks Eric. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 185ed3e59802..7064dbfa8101 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1861,6 +1861,10 @@ static struct sock *__udp4_lib_mcast_demux_lookup(struct net *net, unsigned int count, slot = udp_hashfn(net, hnum, udp_table.mask); struct udp_hslot *hslot = &udp_table.hash[slot]; + /* Do not bother scanning a too big list */ + if (hslot->count > 10) + return NULL; + rcu_read_lock(); begin: count = 0;