net: Orphan and de-dst skbs earlier in xmit path.
authorDavid S. Miller <davem@davemloft.net>
Thu, 22 Apr 2010 08:02:07 +0000 (01:02 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Apr 2010 08:02:07 +0000 (01:02 -0700)
This way GSO packets don't get handled differently.

With help from Eric Dumazet.

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

index 3ba774b6091cb5e014766af2cc1523a7da7850a2..a4a7c36917d1c620d1309c5f4add7f37834fe41d 100644 (file)
@@ -1902,13 +1902,6 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
                if (!list_empty(&ptype_all))
                        dev_queue_xmit_nit(skb, dev);
 
-               if (netif_needs_gso(dev, skb)) {
-                       if (unlikely(dev_gso_segment(skb)))
-                               goto out_kfree_skb;
-                       if (skb->next)
-                               goto gso;
-               }
-
                /*
                 * If device doesnt need skb->dst, release it right now while
                 * its hot in this cpu cache
@@ -1917,6 +1910,14 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
                        skb_dst_drop(skb);
 
                skb_orphan_try(skb);
+
+               if (netif_needs_gso(dev, skb)) {
+                       if (unlikely(dev_gso_segment(skb)))
+                               goto out_kfree_skb;
+                       if (skb->next)
+                               goto gso;
+               }
+
                rc = ops->ndo_start_xmit(skb, dev);
                if (rc == NETDEV_TX_OK)
                        txq_trans_update(txq);