@samitouri / QOSamiQemu / commits / be33c56898

tests/qtest/libqos: add qvirtqueue_reset_pool() for descriptor pool reset

Add a function to reset the virtqueue descriptor pool state without reinitializing the device. This is useful for tests that issue a high number of requests and are limited by the simplified virtio test driver's descriptor tracking, which decrements num_free but never increments it back. The function is safe for synchronous test code where requests are sent and completed before the next request is issued. Acked-by: Fabiano Rosas <farosas@suse.de> Link: https://lore.kernel.org/qemu-devel/96cf23eea1204b34443218fe76bd4a5eaf9163e8.1779126034.git.qemu_oss@crudebyte.com Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>

Christian Schoenebeck committed May 18, 2026 at 19:36 UTC be33c56898f8b18617cff91525f0b68abee8de07
2 files changed +25
tests/qtest/libqos/virtio.c
+23
@@ -464,6 +464,29 @@ bool qvirtqueue_get_buf(QTestState *qts, QVirtQueue *vq, uint32_t *desc_idx,
464 return true;
465 }
466
467 +/*
468 + * qvirtqueue_reset_pool:
469 + * @vq: The virtqueue to reset
470 + *
471 + * Reset the descriptor pool state without reinitializing the device.
472 + * This is useful for tests that issue a high number of requests and
473 + * are limited by the simplified virtio test driver's descriptor tracking,
474 + * which decrements num_free but never increments it back.
475 + *
476 + * This is only safe for synchronous test code where requests are
477 + * sent and completed before the next request is issued. Do not use
478 + * with asynchronous code where multiple requests may be in-flight.
479 + *
480 + * Note: This only resets the available descriptor pool (free_head,
481 + * num_free). The used ring position (last_used_idx) is NOT reset
482 + * and should continue to track consumed responses across iterations.
483 + */
484 +void qvirtqueue_reset_pool(QVirtQueue *vq)
485 +{
486 + vq->free_head = 0;
487 + vq->num_free = vq->size;
488 +}
489 +
490 void qvirtqueue_set_used_event(QTestState *qts, QVirtQueue *vq, uint16_t idx)
491 {
492 g_assert(vq->event);
tests/qtest/libqos/virtio.h
+2
@@ -150,6 +150,8 @@ void qvirtqueue_kick(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq,
150 bool qvirtqueue_get_buf(QTestState *qts, QVirtQueue *vq, uint32_t *desc_idx,
151 uint32_t *len);
152
153 +void qvirtqueue_reset_pool(QVirtQueue *vq);
154 +
155 void qvirtqueue_set_used_event(QTestState *qts, QVirtQueue *vq, uint16_t idx);
156
157 void qvirtio_start_device(QVirtioDevice *vdev);