ipv4: take rt_uncached_lock only if needed
authorEric Dumazet <edumazet@google.com>
Fri, 24 Aug 2012 05:40:47 +0000 (05:40 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Aug 2012 15:47:48 +0000 (11:47 -0400)
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>
net/ipv4/route.c

index 8c8c748..24fd4c5 100644 (file)
@@ -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);