On Mon, 19 Mar 2012 10:11:58 -0700 Eric Dumazet <eric.dumazet@xxxxxxxxx> wrote: > On Mon, 2012-03-19 at 10:02 -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. > > > > Signed-off-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> > > Reviewed-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx> > > --- > > drivers/net/hyperv/netvsc_drv.c | 5 +---- > > 1 files changed, 1 insertions(+), 4 deletions(-) > > > > 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; > > } > > > > /* > > Thats simply not true at all. > > A start_xmit() cannot do that. > > TX_BUSY should never be returned at all, its a deprecated code, for > pretty good reasons. (assuming queue is not stopped) > > Try this on a machine with one CPU, I am pretty sure this can trigger > complete freezes. > > Once softirq loops in your start_xmit(), how do you think one process > can help you now ? Eric is right, look how devices with real physical rings work. They test for space left at end of start xmit and stop the transmit queue with netif_stop_queue. The transmit done code then re-enables when enough space is netif_wake_queue. Think of it as classic high/low water mark on a FIFO. _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel