@@ -155,6 +155,8 @@ struct VirtQueue
/* In-Order */
GHashTable *in_order_ht;
+ uint16_t current_order_idx;
+ uint16_t current_order_key;
};
const char *virtio_device_names[] = {
@@ -2103,6 +2105,8 @@ static void __virtio_queue_reset(VirtIODevice *vdev, uint32_t i)
if (vdev->vq[i].in_order_ht != NULL) {
g_hash_table_remove_all(vdev->vq[i].in_order_ht);
}
+ vdev->vq[i].current_order_idx = 0;
+ vdev->vq[i].current_order_key = 0;
virtio_virtqueue_reset_region_cache(&vdev->vq[i]);
}
@@ -2357,6 +2361,8 @@ VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL,
free_in_order_vq_element);
}
+ vdev->vq[i].current_order_idx = 0;
+ vdev->vq[i].current_order_key = 0;
return &vdev->vq[i];
}
@@ -75,6 +75,7 @@ typedef struct VirtQueueElement
hwaddr *out_addr;
struct iovec *in_sg;
struct iovec *out_sg;
+ uint16_t order_key;
} VirtQueueElement;
typedef struct InOrderVQElement {
Define order variables for their use in a VirtQueue's in-order hash table. Also initialize current_order variables to 0 when creating or resetting a VirtQueue. These variables are used when the device has negotiated the VIRTIO_F_IN_ORDER transport feature. A VirtQueue's current_order_idx represents the next expected index in the sequence of VirtQueueElements to be processed (put on the used ring). The next VirtQueueElement to be processed must match this sequence number before additional elements can be safely added to the used ring. A VirtQueue's current_order_key is essentially a counter whose value is saved as a key in a VirtQueueElement. After the value has been assigned to the VirtQueueElement, the counter is incremented. All VirtQueueElements being used by the device are assigned a key value and the sequence at which they're assigned must be preserved when the device puts these elements on the used ring. A VirtQueueElement's order_key is value of a VirtQueue's current_order_key at the time of the VirtQueueElement's creation. This value must match with the VirtQueue's current_order_idx before it's able to be put on the used ring by the device. Signed-off-by: Jonah Palmer <jonah.palmer@oracle.com> --- hw/virtio/virtio.c | 6 ++++++ include/hw/virtio/virtio.h | 1 + 2 files changed, 7 insertions(+)