Implements in-order handling for the virtio-net device. Since virtio-net utilizes batching for its Rx VirtQueue, the device is responsible for calling virtqueue_flush once it has completed its batching operation.
Note: ----- It's unclear if this implementation is really necessary to "guarantee" that used VirtQueueElements are put on the used ring in-order since, by design, virtio-net already does this with its Rx VirtQueue. Signed-off-by: Jonah Palmer <jonah.pal...@oracle.com> --- hw/net/virtio-net.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9959f1932b..b0375f7e5e 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -2069,7 +2069,11 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf, for (j = 0; j < i; j++) { /* signal other side */ - virtqueue_fill(q->rx_vq, elems[j], lens[j], j); + if (virtio_vdev_has_feature(vdev, VIRTIO_F_IN_ORDER)) { + virtqueue_order_element(q->rx_vq, elems[j], lens[j], j, 0); + } else { + virtqueue_fill(q->rx_vq, elems[j], lens[j], j); + } g_free(elems[j]); } -- 2.39.3