79c4324644
Change-Id: I2d302dda68298877c65c99147f5bf22186a59aac
163 lines
5.4 KiB
Diff
163 lines
5.4 KiB
Diff
From 539c46ecb41417007840c750d364b5332cbdc5b5 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
|
|
Date: Thu, 15 Dec 2022 12:31:35 +0100
|
|
Subject: [PATCH] vhost: allocate SVQ device file descriptors at device start
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The next patches will start control SVQ if possible. However, we don't
|
|
know if that will be possible at qemu boot anymore.
|
|
|
|
Delay device file descriptors until we know it at device start. This
|
|
will avoid to create them if the device does not support SVQ.
|
|
|
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
|
Acked-by: Jason Wang <jasowang@redhat.com>
|
|
Message-Id: <20221215113144.322011-4-eperezma@redhat.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: fangyi <eric.fangyi@huawei.com>
|
|
---
|
|
hw/virtio/vhost-shadow-virtqueue.c | 31 ++------------------------
|
|
hw/virtio/vhost-vdpa.c | 35 ++++++++++++++++++++++++------
|
|
2 files changed, 30 insertions(+), 36 deletions(-)
|
|
|
|
diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c
|
|
index bc12bb42f3..47e831667c 100644
|
|
--- a/hw/virtio/vhost-shadow-virtqueue.c
|
|
+++ b/hw/virtio/vhost-shadow-virtqueue.c
|
|
@@ -692,43 +692,18 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq)
|
|
* @iova_tree: Tree to perform descriptors translations
|
|
* @ops: SVQ owner callbacks
|
|
* @ops_opaque: ops opaque pointer
|
|
- *
|
|
- * Returns the new virtqueue or NULL.
|
|
- *
|
|
- * In case of error, reason is reported through error_report.
|
|
*/
|
|
VhostShadowVirtqueue *vhost_svq_new(VhostIOVATree *iova_tree,
|
|
const VhostShadowVirtqueueOps *ops,
|
|
void *ops_opaque)
|
|
{
|
|
- g_autofree VhostShadowVirtqueue *svq = g_new0(VhostShadowVirtqueue, 1);
|
|
- int r;
|
|
-
|
|
- r = event_notifier_init(&svq->hdev_kick, 0);
|
|
- if (r != 0) {
|
|
- error_report("Couldn't create kick event notifier: %s (%d)",
|
|
- g_strerror(errno), errno);
|
|
- goto err_init_hdev_kick;
|
|
- }
|
|
-
|
|
- r = event_notifier_init(&svq->hdev_call, 0);
|
|
- if (r != 0) {
|
|
- error_report("Couldn't create call event notifier: %s (%d)",
|
|
- g_strerror(errno), errno);
|
|
- goto err_init_hdev_call;
|
|
- }
|
|
+ VhostShadowVirtqueue *svq = g_new0(VhostShadowVirtqueue, 1);
|
|
|
|
event_notifier_init_fd(&svq->svq_kick, VHOST_FILE_UNBIND);
|
|
svq->iova_tree = iova_tree;
|
|
svq->ops = ops;
|
|
svq->ops_opaque = ops_opaque;
|
|
- return g_steal_pointer(&svq);
|
|
-
|
|
-err_init_hdev_call:
|
|
- event_notifier_cleanup(&svq->hdev_kick);
|
|
-
|
|
-err_init_hdev_kick:
|
|
- return NULL;
|
|
+ return svq;
|
|
}
|
|
|
|
/**
|
|
@@ -740,7 +715,5 @@ void vhost_svq_free(gpointer pvq)
|
|
{
|
|
VhostShadowVirtqueue *vq = pvq;
|
|
vhost_svq_stop(vq);
|
|
- event_notifier_cleanup(&vq->hdev_kick);
|
|
- event_notifier_cleanup(&vq->hdev_call);
|
|
g_free(vq);
|
|
}
|
|
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
|
|
index 08f92bf781..23e715b05c 100644
|
|
--- a/hw/virtio/vhost-vdpa.c
|
|
+++ b/hw/virtio/vhost-vdpa.c
|
|
@@ -430,15 +430,11 @@ static int vhost_vdpa_init_svq(struct vhost_dev *hdev, struct vhost_vdpa *v,
|
|
|
|
shadow_vqs = g_ptr_array_new_full(hdev->nvqs, vhost_svq_free);
|
|
for (unsigned n = 0; n < hdev->nvqs; ++n) {
|
|
- g_autoptr(VhostShadowVirtqueue) svq;
|
|
+ VhostShadowVirtqueue *svq;
|
|
|
|
svq = vhost_svq_new(v->iova_tree, v->shadow_vq_ops,
|
|
v->shadow_vq_ops_opaque);
|
|
- if (unlikely(!svq)) {
|
|
- error_setg(errp, "Cannot create svq %u", n);
|
|
- return -1;
|
|
- }
|
|
- g_ptr_array_add(shadow_vqs, g_steal_pointer(&svq));
|
|
+ g_ptr_array_add(shadow_vqs, svq);
|
|
}
|
|
|
|
v->shadow_vqs = g_steal_pointer(&shadow_vqs);
|
|
@@ -866,11 +862,23 @@ static int vhost_vdpa_svq_set_fds(struct vhost_dev *dev,
|
|
const EventNotifier *event_notifier = &svq->hdev_kick;
|
|
int r;
|
|
|
|
+ r = event_notifier_init(&svq->hdev_kick, 0);
|
|
+ if (r != 0) {
|
|
+ error_setg_errno(errp, -r, "Couldn't create kick event notifier");
|
|
+ goto err_init_hdev_kick;
|
|
+ }
|
|
+
|
|
+ r = event_notifier_init(&svq->hdev_call, 0);
|
|
+ if (r != 0) {
|
|
+ error_setg_errno(errp, -r, "Couldn't create call event notifier");
|
|
+ goto err_init_hdev_call;
|
|
+ }
|
|
+
|
|
file.fd = event_notifier_get_fd(event_notifier);
|
|
r = vhost_vdpa_set_vring_dev_kick(dev, &file);
|
|
if (unlikely(r != 0)) {
|
|
error_setg_errno(errp, -r, "Can't set device kick fd");
|
|
- return r;
|
|
+ goto err_init_set_dev_fd;
|
|
}
|
|
|
|
event_notifier = &svq->hdev_call;
|
|
@@ -878,8 +886,18 @@ static int vhost_vdpa_svq_set_fds(struct vhost_dev *dev,
|
|
r = vhost_vdpa_set_vring_dev_call(dev, &file);
|
|
if (unlikely(r != 0)) {
|
|
error_setg_errno(errp, -r, "Can't set device call fd");
|
|
+ goto err_init_set_dev_fd;
|
|
}
|
|
|
|
+ return 0;
|
|
+
|
|
+err_init_set_dev_fd:
|
|
+ event_notifier_set_handler(&svq->hdev_call, NULL);
|
|
+
|
|
+err_init_hdev_call:
|
|
+ event_notifier_cleanup(&svq->hdev_kick);
|
|
+
|
|
+err_init_hdev_kick:
|
|
return r;
|
|
}
|
|
|
|
@@ -1091,6 +1109,9 @@ static void vhost_vdpa_svqs_stop(struct vhost_dev *dev)
|
|
for (unsigned i = 0; i < v->shadow_vqs->len; ++i) {
|
|
VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, i);
|
|
vhost_vdpa_svq_unmap_rings(dev, svq);
|
|
+
|
|
+ event_notifier_cleanup(&svq->hdev_kick);
|
|
+ event_notifier_cleanup(&svq->hdev_call);
|
|
}
|
|
}
|
|
|
|
--
|
|
2.27.0
|
|
|