| Submitter | David Miller |
|---|---|
| Date | April 22, 2010, 7:54 a.m. |
| Message ID | <20100422.005421.155629785.davem@davemloft.net> |
| Download | mbox | patch |
| Permalink | /patch/50701/ |
| State | Accepted |
| Delegated to: | David Miller |
| Headers | show |
Comments
Le jeudi 22 avril 2010 à 00:54 -0700, David Miller a écrit : > From: Eric Dumazet <eric.dumazet@gmail.com> > Date: Thu, 22 Apr 2010 09:47:03 +0200 > > > You could have one skb_orphan_try() call before the > > > > if (netif_needs_gso(dev, skb)) { > > > > and remove it from dev_gso_segment() ? > > Yes, that's much more concise. This should be ready to go: > > net: Orphan and de-dst skbs earlier in xmit path. > > This way GSO packets don't get handled differently. > > With help from Eric Dumazet. > > Signed-off-by: David S. Miller <davem@davemloft.net> > > diff --git a/net/core/dev.c b/net/core/dev.c > index 3ba774b..a4a7c36 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -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); Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Thanks David ! -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Patch
diff --git a/net/core/dev.c b/net/core/dev.c index 3ba774b..a4a7c36 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -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);