net: call dev_queue_xmit_nit() after skb_dst_drop()
authorEric Dumazet <eric.dumazet@gmail.com>
Tue, 7 Dec 2010 00:30:37 +0000 (00:30 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Dec 2010 18:39:54 +0000 (10:39 -0800)
Avoid some atomic ops on dst refcount, calling dev_queue_xmit_nit()
after skb_dst_drop() in dev_hard_start_xmit().

When queueing a packet into af_packet socket, we drop dst anyway.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 822b15b8d11c13489e0f77a1ac707926b57b79ed..d28b3a023bb2101f4884a03957e6856d1c2efe05 100644 (file)
@@ -2022,9 +2022,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
        int rc = NETDEV_TX_OK;
 
        if (likely(!skb->next)) {
-               if (!list_empty(&ptype_all))
-                       dev_queue_xmit_nit(skb, dev);
-
                /*
                 * If device doesnt need skb->dst, release it right now while
                 * its hot in this cpu cache
@@ -2032,6 +2029,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
                if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
                        skb_dst_drop(skb);
 
+               if (!list_empty(&ptype_all))
+                       dev_queue_xmit_nit(skb, dev);
+
                skb_orphan_try(skb);
 
                if (vlan_tx_tag_present(skb) &&