|
@@ -2526,6 +2526,7 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
|
|
|
VirtIONet *n = qemu_get_nic_opaque(nc);
|
|
|
VirtIONetQueue *q = virtio_net_get_subqueue(nc);
|
|
|
VirtIODevice *vdev = VIRTIO_DEVICE(n);
|
|
|
+ int ret;
|
|
|
|
|
|
virtqueue_push(q->tx_vq, q->async_tx.elem, 0);
|
|
|
virtio_notify(vdev, q->tx_vq);
|
|
@@ -2534,7 +2535,17 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
|
|
|
q->async_tx.elem = NULL;
|
|
|
|
|
|
virtio_queue_set_notification(q->tx_vq, 1);
|
|
|
- virtio_net_flush_tx(q);
|
|
|
+ ret = virtio_net_flush_tx(q);
|
|
|
+ if (q->tx_bh && ret >= n->tx_burst) {
|
|
|
+ /*
|
|
|
+ * the flush has been stopped by tx_burst
|
|
|
+ * we will not receive notification for the
|
|
|
+ * remainining part, so re-schedule
|
|
|
+ */
|
|
|
+ virtio_queue_set_notification(q->tx_vq, 0);
|
|
|
+ qemu_bh_schedule(q->tx_bh);
|
|
|
+ q->tx_waiting = 1;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* TX */
|