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);

Reply via email to