Message ID | 1332192233-32305-2-git-send-email-haiyangz@microsoft.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, 2012-03-19 at 14:23 -0700, Haiyang Zhang wrote: > Instead of dropping the packet, we keep the skb buffer, and return > NETDEV_TX_BUSY to let upper layer retry send. This will not cause > endless loop, because the host is taking data away from ring buffer, > and we have called the stop_queue before returning NETDEV_TX_BUSY. > > The stop_queue was called in the function netvsc_send() in file > netvsc.c, then it returns to rndis_filter_send(), which returns to > netvsc_start_xmit() in file netvsc_drv.c. So the NETDEV_TX_BUSY is > indeed returned AFTER queue is stopped. > > Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> > Reviewed-by: K. Y. Srinivasan <kys@microsoft.com> > --- Thanks Acked-by: Eric Dumazet <eric.dumazet@gmail.com> -- 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
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Mon, 19 Mar 2012 14:23:11 -0700 > On Mon, 2012-03-19 at 14:23 -0700, Haiyang Zhang wrote: >> Instead of dropping the packet, we keep the skb buffer, and return >> NETDEV_TX_BUSY to let upper layer retry send. This will not cause >> endless loop, because the host is taking data away from ring buffer, >> and we have called the stop_queue before returning NETDEV_TX_BUSY. >> >> The stop_queue was called in the function netvsc_send() in file >> netvsc.c, then it returns to rndis_filter_send(), which returns to >> netvsc_start_xmit() in file netvsc_drv.c. So the NETDEV_TX_BUSY is >> indeed returned AFTER queue is stopped. >> >> Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> >> Reviewed-by: K. Y. Srinivasan <kys@microsoft.com> >> --- > > Thanks > > Acked-by: Eric Dumazet <eric.dumazet@gmail.com> Applied. -- 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/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 2517d20..dd29478 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -223,13 +223,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) net->stats.tx_bytes += skb->len; net->stats.tx_packets++; } else { - /* we are shutting down or bus overloaded, just drop packet */ - net->stats.tx_dropped++; kfree(packet); - dev_kfree_skb_any(skb); } - return NETDEV_TX_OK; + return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK; } /*