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:
parent
f24fd89ab5
commit
da24e906cb
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue