You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.4 KiB
88 lines
3.4 KiB
2 years ago
|
From 3f2ba7cce6b272a8b5c8953e8923e799e4aa7b88 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
||
|
Date: Mon, 18 Jul 2022 14:05:45 +0200
|
||
|
Subject: [PATCH 02/23] vhost: Get vring base from vq, not svq
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: Eugenio Pérez <eperezma@redhat.com>
|
||
|
RH-MergeRequest: 116: vdpa: Restore device state on destination
|
||
|
RH-Bugzilla: 2114060
|
||
|
RH-Acked-by: Cindy Lu <lulu@redhat.com>
|
||
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||
|
RH-Commit: [1/21] e7e0294bbc98f69ccdbc4af4715857e77b017f80 (eperezmartin/qemu-kvm)
|
||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2114060
|
||
|
Upstream status: Merged
|
||
|
|
||
|
The SVQ vring used idx usually match with the guest visible one, as long
|
||
|
as all the guest buffers (GPA) maps to exactly one buffer within qemu's
|
||
|
VA. However, as we can see in virtqueue_map_desc, a single guest buffer
|
||
|
could map to many buffers in SVQ vring.
|
||
|
|
||
|
Also, its also a mistake to rewind them at the source of migration.
|
||
|
Since VirtQueue is able to migrate the inflight descriptors, its
|
||
|
responsability of the destination to perform the rewind just in case it
|
||
|
cannot report the inflight descriptors to the device.
|
||
|
|
||
|
This makes easier to migrate between backends or to recover them in
|
||
|
vhost devices that support set in flight descriptors.
|
||
|
|
||
|
Fixes: 6d0b22266633 ("vdpa: Adapt vhost_vdpa_get_vring_base to SVQ")
|
||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||
|
(cherry picked from commit 2fdac348fd3d243bb964937236af3cc27ae7af2b)
|
||
|
---
|
||
|
hw/virtio/vhost-vdpa.c | 24 ++++++++++++------------
|
||
|
1 file changed, 12 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
|
||
|
index 03dc6014b0..96334ab5b6 100644
|
||
|
--- a/hw/virtio/vhost-vdpa.c
|
||
|
+++ b/hw/virtio/vhost-vdpa.c
|
||
|
@@ -1177,7 +1177,18 @@ 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
|
||
|
@@ -1193,21 +1204,10 @@ static int vhost_vdpa_get_vring_base(struct vhost_dev *dev,
|
||
|
struct vhost_vring_state *ring)
|
||
|
{
|
||
|
struct vhost_vdpa *v = dev->opaque;
|
||
|
- int vdpa_idx = ring->index - dev->vq_index;
|
||
|
int ret;
|
||
|
|
||
|
if (v->shadow_vqs_enabled) {
|
||
|
- VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, vdpa_idx);
|
||
|
-
|
||
|
- /*
|
||
|
- * Setting base as last used idx, so destination will see as available
|
||
|
- * all the entries that the device did not use, including the in-flight
|
||
|
- * processing ones.
|
||
|
- *
|
||
|
- * TODO: This is ok for networking, but other kinds of devices might
|
||
|
- * have problems with these retransmissions.
|
||
|
- */
|
||
|
- ring->num = svq->last_used_idx;
|
||
|
+ ring->num = virtio_queue_get_last_avail_idx(dev->vdev, ring->index);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.31.1
|
||
|
|