Skip to content

Commit 2d4ba6c

Browse files
mcoquelinmstsirkin
authored andcommitted
virtio: Add queue interface to restore avail index from vring used index
In case of backend crash, it is not possible to restore internal avail index from the backend value as vhost_get_vring_base callback fails. This patch provides a new interface to restore internal avail index from the vring used index, as done by some vhost-user backend on reconnection. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
1 parent 861fec4 commit 2d4ba6c

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

hw/virtio/virtio.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2310,6 +2310,16 @@ void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx)
23102310
vdev->vq[n].shadow_avail_idx = idx;
23112311
}
23122312

2313+
void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n)
2314+
{
2315+
rcu_read_lock();
2316+
if (vdev->vq[n].vring.desc) {
2317+
vdev->vq[n].last_avail_idx = vring_used_idx(&vdev->vq[n]);
2318+
vdev->vq[n].shadow_avail_idx = vdev->vq[n].last_avail_idx;
2319+
}
2320+
rcu_read_unlock();
2321+
}
2322+
23132323
void virtio_queue_update_used_idx(VirtIODevice *vdev, int n)
23142324
{
23152325
rcu_read_lock();

include/hw/virtio/virtio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n);
272272
hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
273273
uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
274274
void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx);
275+
void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n);
275276
void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n);
276277
void virtio_queue_update_used_idx(VirtIODevice *vdev, int n);
277278
VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n);

0 commit comments

Comments
 (0)