net/hyperv: Fix the code handling tx busy

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>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Haiyang Zhang 2012-03-19 17:27:06 -04:00 committed by David S. Miller
parent f24fd89ab5
commit da24e906cb
1 changed files with 1 additions and 4 deletions

View File

@ -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_bytes += skb->len;
net->stats.tx_packets++; net->stats.tx_packets++;
} else { } else {
/* we are shutting down or bus overloaded, just drop packet */
net->stats.tx_dropped++;
kfree(packet); kfree(packet);
dev_kfree_skb_any(skb);
} }
return NETDEV_TX_OK; return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK;
} }
/* /*