Christian Schoenebeck <[email protected]> writes: > 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. > > Signed-off-by: Christian Schoenebeck <[email protected]>
Acked-by: Fabiano Rosas <[email protected]> > --- > tests/qtest/libqos/virtio.c | 23 +++++++++++++++++++++++ > tests/qtest/libqos/virtio.h | 2 ++ > 2 files changed, 25 insertions(+) > > diff --git a/tests/qtest/libqos/virtio.c b/tests/qtest/libqos/virtio.c > index 010ff40834..ccbb325222 100644 > --- a/tests/qtest/libqos/virtio.c > +++ b/tests/qtest/libqos/virtio.c > @@ -464,6 +464,29 @@ bool qvirtqueue_get_buf(QTestState *qts, QVirtQueue *vq, > uint32_t *desc_idx, > return true; > } > > +/* > + * qvirtqueue_reset_pool: > + * @vq: The virtqueue to reset > + * > + * Reset the 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. > + * > + * This is only safe for synchronous test code where requests are > + * sent and completed before the next request is issued. Do not use > + * with asynchronous code where multiple requests may be in-flight. > + * > + * Note: This only resets the available descriptor pool (free_head, > + * num_free). The used ring position (last_used_idx) is NOT reset > + * and should continue to track consumed responses across iterations. > + */ > +void qvirtqueue_reset_pool(QVirtQueue *vq) > +{ > + vq->free_head = 0; > + vq->num_free = vq->size; > +} > + > void qvirtqueue_set_used_event(QTestState *qts, QVirtQueue *vq, uint16_t idx) > { > g_assert(vq->event); > diff --git a/tests/qtest/libqos/virtio.h b/tests/qtest/libqos/virtio.h > index e238f1726f..f17be0b9b6 100644 > --- a/tests/qtest/libqos/virtio.h > +++ b/tests/qtest/libqos/virtio.h > @@ -150,6 +150,8 @@ void qvirtqueue_kick(QTestState *qts, QVirtioDevice *d, > QVirtQueue *vq, > bool qvirtqueue_get_buf(QTestState *qts, QVirtQueue *vq, uint32_t *desc_idx, > uint32_t *len); > > +void qvirtqueue_reset_pool(QVirtQueue *vq); > + > void qvirtqueue_set_used_event(QTestState *qts, QVirtQueue *vq, uint16_t > idx); > > void qvirtio_start_device(QVirtioDevice *vdev);
