From d7825623a9d4452f97da7ea0d84b2967d507ccf9 Mon Sep 17 00:00:00 2001 From: Li RongQing Date: Thu, 10 Sep 2026 20:39:03 +0800 Subject: [PATCH] virtio_ring: reset IN_ORDER state in virtqueue_init() The IN_ORDER feature uses additional software state to track the next available descriptor and in-flight descriptor batches. virtqueue_init() resets the common virtqueue state, but free_head and batch_last.id are initialized only when the virtqueue is created. When an IN_ORDER virtqueue is reset, these fields can retain state from the previous queue instance. Reset free_head and invalidate batch_last when initializing an IN_ORDER virtqueue. Keep this in virtqueue_init() so the state is initialized consistently for both newly created and reset virtqueues. Fixes: f6a15d854986 ("virtio_ring: add in order support") Signed-off-by: Li RongQing Signed-off-by: Michael S. Tsirkin Message-ID: <20260910123903.1717-1-lirongqing@baidu.com> --- drivers/virtio/virtio_ring.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index db678f5a80e0..d0dc4645b5b3 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -559,6 +559,11 @@ static void virtqueue_init(struct vring_virtqueue *vq, u32 num) vq->in_use = false; vq->last_add_time_valid = false; #endif + + if (virtqueue_is_in_order(vq)) { + vq->free_head = 0; + vq->batch_last.id = UINT_MAX; + } }