[RFC PATCH 6/8] tests: vhost-vdpa: test out-of-order descriptor completion

Eugenio Pérez posted 8 patches 1 month, 1 week ago
Maintainers: Fabiano Rosas <farosas@suse.de>, Laurent Vivier <lvivier@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>
[RFC PATCH 6/8] tests: vhost-vdpa: test out-of-order descriptor completion
Posted by Eugenio Pérez 1 month, 1 week ago
Add tests that submit descriptors in one order but complete them in
a different order:
- Submit desc1 then desc2, complete desc2 then desc1
- Same pattern with 2-descriptor chains

This verifies SVQ correctly handles devices that don't preserve
submission order in completions.

Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
 tests/qtest/vhost-vdpa-test.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/tests/qtest/vhost-vdpa-test.c b/tests/qtest/vhost-vdpa-test.c
index 433e5d71ca7a..5efe688673cb 100644
--- a/tests/qtest/vhost-vdpa-test.c
+++ b/tests/qtest/vhost-vdpa-test.c
@@ -571,7 +571,7 @@ static void vhost_vdpa_tx_test(void *obj, void *arg, QGuestAllocator *alloc)
 {
     TestServer *server = arg;
     QVirtioNet *net = obj;
-    uint32_t free_head;
+    uint32_t free_head, free_head2;
 
     /* Add some rx packets so SVQ must clean them at the end of QEMU run */
     vhost_vdpa_add_rx_pkts(alloc, net, &server->vdpa_thread);
@@ -588,6 +588,24 @@ static void vhost_vdpa_tx_test(void *obj, void *arg, QGuestAllocator *alloc)
     vhost_vdpa_kick_tx_desc(&server->vdpa_thread, net, free_head, 2);
     vhost_vdpa_get_tx_pkt(alloc, net, free_head, &server->vdpa_thread);
 
+    /* Out of order descriptors */
+    free_head = vhost_vdpa_add_tx_pkt_descs(alloc, net, &server->vdpa_thread,
+                                            1);
+    free_head2 = vhost_vdpa_add_tx_pkt_descs(alloc, net, &server->vdpa_thread,
+                                             1);
+    vhost_vdpa_kick_tx_desc(&server->vdpa_thread, net, free_head2, 1);
+    vhost_vdpa_kick_tx_desc(&server->vdpa_thread, net, free_head, 1);
+
+    vhost_vdpa_get_tx_pkt(alloc, net, free_head2, &server->vdpa_thread);
+    vhost_vdpa_get_tx_pkt(alloc, net, free_head, &server->vdpa_thread);
+
+    /* Out of order chains */
+    free_head = vhost_vdpa_add_tx_pkt_descs(alloc, net, &server->vdpa_thread,
+                                            2);
+    free_head2 = vhost_vdpa_add_tx_pkt_descs(alloc, net, &server->vdpa_thread,
+                                             2);
+    vhost_vdpa_kick_tx_desc(&server->vdpa_thread, net, free_head2, 2);
+    vhost_vdpa_kick_tx_desc(&server->vdpa_thread, net, free_head, 2);
 }
 
 static void register_vhost_vdpa_test(void)
-- 
2.53.0