? 2023/2/24 23:54, Eugenio P?rez ??:> At this moment it is only possible to migrate to a vdpa device running
> with x-svq=on. As a protective measure, the rewind of the inflight
> descriptors was done at the destination. That way if the source sent a
> virtqueue with inuse descriptors they are always discarded.
>
> Since this series allows to migrate also to passthrough devices with no
> SVQ, the right thing to do is to rewind at the source so the base of
> vrings are correct.
>
> Support for inflight descriptors may be added in the future.
>
> Signed-off-by: Eugenio P?rez <eperezma at redhat.com>
Acked-by: Jason Wang <jasowang at redhat.com>
Thanks
> ---
> v4:
> * Use virtqueue_unpop at vhost_svq_stop instead of rewinding at
> vhost_vdpa_get_vring_base.
> ---
> hw/virtio/vhost-shadow-virtqueue.c | 8 ++++++--
> hw/virtio/vhost-vdpa.c | 11 -----------
> 2 files changed, 6 insertions(+), 13 deletions(-)
>
> diff --git a/hw/virtio/vhost-shadow-virtqueue.c
b/hw/virtio/vhost-shadow-virtqueue.c
> index 4307296358..523b379439 100644
> --- a/hw/virtio/vhost-shadow-virtqueue.c
> +++ b/hw/virtio/vhost-shadow-virtqueue.c
> @@ -694,13 +694,17 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq)
> g_autofree VirtQueueElement *elem = NULL;
> elem = g_steal_pointer(&svq->desc_state[i].elem);
> if (elem) {
> - virtqueue_detach_element(svq->vq, elem, 0);
> + /*
> + * TODO: This is ok for networking, but other kinds of devices
> + * might have problems with just unpop these.
> + */
> + virtqueue_unpop(svq->vq, elem, 0);
> }
> }
>
> next_avail_elem =
g_steal_pointer(&svq->next_guest_avail_elem);
> if (next_avail_elem) {
> - virtqueue_detach_element(svq->vq, next_avail_elem, 0);
> + virtqueue_unpop(svq->vq, next_avail_elem, 0);
> }
> svq->vq = NULL;
> g_free(svq->desc_next);
> diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
> index f542960a64..71e3dc21fe 100644
> --- a/hw/virtio/vhost-vdpa.c
> +++ b/hw/virtio/vhost-vdpa.c
> @@ -1218,18 +1218,7 @@ static int vhost_vdpa_set_vring_base(struct
vhost_dev *dev,
> struct vhost_vring_state *ring)
> {
> struct vhost_vdpa *v = dev->opaque;
> - VirtQueue *vq = virtio_get_queue(dev->vdev, ring->index);
>
> - /*
> - * vhost-vdpa devices does not support in-flight requests. Set all of
them
> - * as available.
> - *
> - * TODO: This is ok for networking, but other kinds of devices might
> - * have problems with these retransmissions.
> - */
> - while (virtqueue_rewind(vq, 1)) {
> - continue;
> - }
> if (v->shadow_vqs_enabled) {
> /*
> * Device vring base was set at device start. SVQ base is handled
by