summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2012-08-24 05:40:47 +0000
committerDavid S. Miller <davem@davemloft.net>2012-08-24 11:47:48 -0400
commit78df76a065ae3b5dbcb9a29912adc02f697de498 (patch)
tree5b9ab36790a2e0101a15d70bdf41b066ce0e55aa
parenta0dfb2634e5671770f598cda08002d8cda66ac77 (diff)
downloadlinux-stable-78df76a065ae3b5dbcb9a29912adc02f697de498.tar.gz
linux-stable-78df76a065ae3b5dbcb9a29912adc02f697de498.tar.bz2
linux-stable-78df76a065ae3b5dbcb9a29912adc02f697de498.zip
ipv4: take rt_uncached_lock only if needed
Multicast traffic allocates dst with DST_NOCACHE, but dst is not inserted into rt_uncached_list. This slowdown multicast workloads on SMP because rt_uncached_lock is contended. Change the test before taking the lock to actually check the dst was inserted into rt_uncached_list. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv4/route.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 8c8c748ebb28..24fd4c596643 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1263,7 +1263,7 @@ static void ipv4_dst_destroy(struct dst_entry *dst)
{
struct rtable *rt = (struct rtable *) dst;
- if (dst->flags & DST_NOCACHE) {
+ if (!list_empty(&rt->rt_uncached)) {
spin_lock_bh(&rt_uncached_lock);
list_del(&rt->rt_uncached);
spin_unlock_bh(&rt_uncached_lock);