net: avoid a pair of dst_hold()/dst_release() in ip_push_pending_frames()
authorEric Dumazet <dada1@cosmosbay.com>
Tue, 25 Nov 2008 00:07:50 +0000 (16:07 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 25 Nov 2008 00:07:50 +0000 (16:07 -0800)
We can reduce pressure on dst entry refcount that slowdown UDP transmit
path on SMP machines. This pressure is visible on RTP servers when
delivering content to mediagateways, especially big ones, handling
thousand of streams. Several cpus send UDP frames to the same
destination, hence use the same dst entry.

This patch makes ip_push_pending_frames() steal the refcount its
callers had to take when filling inet->cork.dst.

This doesnt avoid all refcounting, but still gives speedups on SMP,
on UDP/RAW transmit path.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_output.c

index 5516825a0751e7e9b6e0ede5ff3b19f809a8ff2e..8ebe86dd72af159e2250bc315251cf61561cc38a 100644 (file)
@@ -1284,7 +1284,12 @@ int ip_push_pending_frames(struct sock *sk)
 
        skb->priority = sk->sk_priority;
        skb->mark = sk->sk_mark;
-       skb->dst = dst_clone(&rt->u.dst);
+       /*
+        * Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec
+        * on dst refcount
+        */
+       inet->cork.dst = NULL;
+       skb->dst = &rt->u.dst;
 
        if (iph->protocol == IPPROTO_ICMP)
                icmp_out_count(net, ((struct icmphdr *)