79c4324644
Change-Id: I2d302dda68298877c65c99147f5bf22186a59aac
121 lines
4.1 KiB
Diff
121 lines
4.1 KiB
Diff
From a531a56bddf997f559f67fe9d3dc6d4258c82eb1 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
|
Date: Mon, 14 Mar 2022 18:34:54 +0100
|
|
Subject: [PATCH] vdpa: Expose VHOST_F_LOG_ALL on SVQ
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
SVQ is able to log the dirty bits by itself, so let's use it to not
|
|
block migration.
|
|
|
|
Also, ignore set and clear of VHOST_F_LOG_ALL on set_features if SVQ is
|
|
enabled. Even if the device supports it, the reports would be nonsense
|
|
because SVQ memory is in the qemu region.
|
|
|
|
The log region is still allocated. Future changes might skip that, but
|
|
this series is already long enough.
|
|
|
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
|
Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
|
Signed-off-by: fangyi <eric.fangyi@huawei.com>
|
|
---
|
|
hw/virtio/vhost-vdpa.c | 39 ++++++++++++++++++++++++++++++----
|
|
include/hw/virtio/vhost-vdpa.h | 1 +
|
|
2 files changed, 36 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
|
|
index 840141321a..3b5456cc0e 100644
|
|
--- a/hw/virtio/vhost-vdpa.c
|
|
+++ b/hw/virtio/vhost-vdpa.c
|
|
@@ -375,6 +375,16 @@ static bool vhost_vdpa_one_time_request(struct vhost_dev *dev)
|
|
return v->index != 0;
|
|
}
|
|
|
|
+static int vhost_vdpa_get_dev_features(struct vhost_dev *dev,
|
|
+ uint64_t *features)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ ret = vhost_vdpa_call(dev, VHOST_GET_FEATURES, features);
|
|
+ trace_vhost_vdpa_get_features(dev, *features);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static int vhost_vdpa_init_svq(struct vhost_dev *hdev, struct vhost_vdpa *v,
|
|
Error **errp)
|
|
{
|
|
@@ -387,7 +397,7 @@ static int vhost_vdpa_init_svq(struct vhost_dev *hdev, struct vhost_vdpa *v,
|
|
return 0;
|
|
}
|
|
|
|
- r = hdev->vhost_ops->vhost_get_features(hdev, &dev_features);
|
|
+ r = vhost_vdpa_get_dev_features(hdev, &dev_features);
|
|
if (r != 0) {
|
|
error_setg_errno(errp, -r, "Can't get vdpa device features");
|
|
return r;
|
|
@@ -612,12 +622,29 @@ static int vhost_vdpa_set_mem_table(struct vhost_dev *dev,
|
|
static int vhost_vdpa_set_features(struct vhost_dev *dev,
|
|
uint64_t features)
|
|
{
|
|
+ struct vhost_vdpa *v = dev->opaque;
|
|
int ret;
|
|
|
|
if (vhost_vdpa_one_time_request(dev)) {
|
|
return 0;
|
|
}
|
|
|
|
+ if (v->shadow_vqs_enabled) {
|
|
+ if ((v->acked_features ^ features) == BIT_ULL(VHOST_F_LOG_ALL)) {
|
|
+ /*
|
|
+ * QEMU is just trying to enable or disable logging. SVQ handles
|
|
+ * this sepparately, so no need to forward this.
|
|
+ */
|
|
+ v->acked_features = features;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ v->acked_features = features;
|
|
+
|
|
+ /* We must not ack _F_LOG if SVQ is enabled */
|
|
+ features &= ~BIT_ULL(VHOST_F_LOG_ALL);
|
|
+ }
|
|
+
|
|
trace_vhost_vdpa_set_features(dev, features);
|
|
ret = vhost_vdpa_call(dev, VHOST_SET_FEATURES, &features);
|
|
if (ret) {
|
|
@@ -1202,10 +1229,14 @@ static int vhost_vdpa_set_vring_call(struct vhost_dev *dev,
|
|
static int vhost_vdpa_get_features(struct vhost_dev *dev,
|
|
uint64_t *features)
|
|
{
|
|
- int ret;
|
|
+ struct vhost_vdpa *v = dev->opaque;
|
|
+ int ret = vhost_vdpa_get_dev_features(dev, features);
|
|
+
|
|
+ if (ret == 0 && v->shadow_vqs_enabled) {
|
|
+ /* Add SVQ logging capabilities */
|
|
+ *features |= BIT_ULL(VHOST_F_LOG_ALL);
|
|
+ }
|
|
|
|
- ret = vhost_vdpa_call(dev, VHOST_GET_FEATURES, features);
|
|
- trace_vhost_vdpa_get_features(dev, *features);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h
|
|
index ee8e939ad0..a29dbb3f53 100644
|
|
--- a/include/hw/virtio/vhost-vdpa.h
|
|
+++ b/include/hw/virtio/vhost-vdpa.h
|
|
@@ -30,6 +30,7 @@ typedef struct vhost_vdpa {
|
|
bool iotlb_batch_begin_sent;
|
|
MemoryListener listener;
|
|
struct vhost_vdpa_iova_range iova_range;
|
|
+ uint64_t acked_features;
|
|
bool shadow_vqs_enabled;
|
|
/* IOVA mapping used by the Shadow Virtqueue */
|
|
VhostIOVATree *iova_tree;
|
|
--
|
|
2.27.0
|
|
|