Message ID | 20140901.152459.592105486574617399.davem@davemloft.net |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, 01 Sep 2014 15:24:59 -0700 (PDT) David Miller <davem@davemloft.net> wrote: > diff --git a/net/core/dev.c b/net/core/dev.c > index f0ed5a6..6d82194 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -2600,7 +2600,7 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) > EXPORT_SYMBOL(netif_skb_features); > > static int xmit_one(struct sk_buff *skb, struct net_device *dev, > - struct netdev_queue *txq) > + struct netdev_queue *txq, bool more) > { > unsigned int len; > int rc; > @@ -2610,7 +2610,7 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev, > > len = skb->len; > trace_net_dev_start_xmit(skb, dev); > - rc = netdev_start_xmit(skb, dev, txq, false); > + rc = netdev_start_xmit(skb, dev, txq, more); > > trace_net_dev_xmit(skb, rc, dev, len); > > return rc; > @@ -2626,7 +2626,7 @@ static struct sk_buff *xmit_list(struct sk_buff *first, struct net_device *dev, > struct sk_buff *next = skb->next; > > skb->next = NULL; > - rc = xmit_one(skb, dev, txq); > + rc = xmit_one(skb, dev, txq, next != NULL); Guess, the caller constructing the skb list to xmit_list() must make sure all SKBs have the same TXQ. > if (unlikely(!dev_xmit_complete(rc))) { > skb->next = next; > goto out; In the exit case (!dev_xmit_complete(rc)) is it, 1. the responsibility of the driver to "flush" the tail, or 2. do we depend on qdisc or softirq to be reactivated soonish?
From: Jesper Dangaard Brouer <brouer@redhat.com> Date: Tue, 2 Sep 2014 09:25:38 +0200 > On Mon, 01 Sep 2014 15:24:59 -0700 (PDT) David Miller <davem@davemloft.net> wrote: > >> if (unlikely(!dev_xmit_complete(rc))) { >> skb->next = next; >> goto out; > > In the exit case (!dev_xmit_complete(rc)) is it, > 1. the responsibility of the driver to "flush" the tail, or > 2. do we depend on qdisc or softirq to be reactivated soonish? I think the driver will have to do it, much like it must do so when the queue is stopped. -- 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
diff --git a/net/core/dev.c b/net/core/dev.c index f0ed5a6..6d82194 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2600,7 +2600,7 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) EXPORT_SYMBOL(netif_skb_features); static int xmit_one(struct sk_buff *skb, struct net_device *dev, - struct netdev_queue *txq) + struct netdev_queue *txq, bool more) { unsigned int len; int rc; @@ -2610,7 +2610,7 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev, len = skb->len; trace_net_dev_start_xmit(skb, dev); - rc = netdev_start_xmit(skb, dev, txq, false); + rc = netdev_start_xmit(skb, dev, txq, more); trace_net_dev_xmit(skb, rc, dev, len); return rc; @@ -2626,7 +2626,7 @@ static struct sk_buff *xmit_list(struct sk_buff *first, struct net_device *dev, struct sk_buff *next = skb->next; skb->next = NULL; - rc = xmit_one(skb, dev, txq); + rc = xmit_one(skb, dev, txq, next != NULL); if (unlikely(!dev_xmit_complete(rc))) { skb->next = next; goto out; @@ -2705,7 +2705,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, } } - return xmit_one(skb, dev, txq); + return xmit_one(skb, dev, txq, false); } gso:
Signed-off-by: David S. Miller <davem@davemloft.net> --- net/core/dev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)