148 lines
4.7 KiB
Diff
148 lines
4.7 KiB
Diff
|
|
From 6f38bfce3fc45c1c68329412d146913a155962c7 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:41 +0100
|
||
|
|
Subject: [PATCH] vhost: Add VhostShadowVirtqueue
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
Vhost shadow virtqueue (SVQ) is an intermediate jump for virtqueue
|
||
|
|
notifications and buffers, allowing qemu to track them. While qemu is
|
||
|
|
forwarding the buffers and virtqueue changes, it is able to commit the
|
||
|
|
memory it's being dirtied, the same way regular qemu's VirtIO devices
|
||
|
|
do.
|
||
|
|
|
||
|
|
This commit only exposes basic SVQ allocation and free. Next patches of
|
||
|
|
the series add functionality like notifications and buffers forwarding.
|
||
|
|
|
||
|
|
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/meson.build | 2 +-
|
||
|
|
hw/virtio/vhost-shadow-virtqueue.c | 62 ++++++++++++++++++++++++++++++
|
||
|
|
hw/virtio/vhost-shadow-virtqueue.h | 28 ++++++++++++++
|
||
|
|
3 files changed, 91 insertions(+), 1 deletion(-)
|
||
|
|
create mode 100644 hw/virtio/vhost-shadow-virtqueue.c
|
||
|
|
create mode 100644 hw/virtio/vhost-shadow-virtqueue.h
|
||
|
|
|
||
|
|
diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build
|
||
|
|
index 8e8943e20b..eb46c05a25 100644
|
||
|
|
--- a/hw/virtio/meson.build
|
||
|
|
+++ b/hw/virtio/meson.build
|
||
|
|
@@ -11,7 +11,7 @@ softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-stub.c'))
|
||
|
|
|
||
|
|
virtio_ss = ss.source_set()
|
||
|
|
virtio_ss.add(files('virtio.c'))
|
||
|
|
-virtio_ss.add(when: 'CONFIG_VHOST', if_true: files('vhost.c', 'vhost-backend.c'))
|
||
|
|
+virtio_ss.add(when: 'CONFIG_VHOST', if_true: files('vhost.c', 'vhost-backend.c', 'vhost-shadow-virtqueue.c'))
|
||
|
|
virtio_ss.add(when: 'CONFIG_VHOST_USER', if_true: files('vhost-user.c'))
|
||
|
|
virtio_ss.add(when: 'CONFIG_VHOST_VDPA', if_true: files('vhost-vdpa.c'))
|
||
|
|
virtio_ss.add(when: 'CONFIG_VIRTIO_BALLOON', if_true: files('virtio-balloon.c'))
|
||
|
|
diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c
|
||
|
|
new file mode 100644
|
||
|
|
index 0000000000..c1db02c53e
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/hw/virtio/vhost-shadow-virtqueue.c
|
||
|
|
@@ -0,0 +1,62 @@
|
||
|
|
+/*
|
||
|
|
+ * vhost shadow virtqueue
|
||
|
|
+ *
|
||
|
|
+ * SPDX-FileCopyrightText: Red Hat, Inc. 2021
|
||
|
|
+ * SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
|
||
|
|
+ *
|
||
|
|
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+#include "qemu/osdep.h"
|
||
|
|
+#include "hw/virtio/vhost-shadow-virtqueue.h"
|
||
|
|
+
|
||
|
|
+#include "qemu/error-report.h"
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * Creates vhost shadow virtqueue, and instructs the vhost device to use the
|
||
|
|
+ * shadow methods and file descriptors.
|
||
|
|
+ *
|
||
|
|
+ * Returns the new virtqueue or NULL.
|
||
|
|
+ *
|
||
|
|
+ * In case of error, reason is reported through error_report.
|
||
|
|
+ */
|
||
|
|
+VhostShadowVirtqueue *vhost_svq_new(void)
|
||
|
|
+{
|
||
|
|
+ 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;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return g_steal_pointer(&svq);
|
||
|
|
+
|
||
|
|
+err_init_hdev_call:
|
||
|
|
+ event_notifier_cleanup(&svq->hdev_kick);
|
||
|
|
+
|
||
|
|
+err_init_hdev_kick:
|
||
|
|
+ return NULL;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+/**
|
||
|
|
+ * Free the resources of the shadow virtqueue.
|
||
|
|
+ *
|
||
|
|
+ * @pvq: gpointer to SVQ so it can be used by autofree functions.
|
||
|
|
+ */
|
||
|
|
+void vhost_svq_free(gpointer pvq)
|
||
|
|
+{
|
||
|
|
+ VhostShadowVirtqueue *vq = pvq;
|
||
|
|
+ event_notifier_cleanup(&vq->hdev_kick);
|
||
|
|
+ event_notifier_cleanup(&vq->hdev_call);
|
||
|
|
+ g_free(vq);
|
||
|
|
+}
|
||
|
|
diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h
|
||
|
|
new file mode 100644
|
||
|
|
index 0000000000..f1519e3c7b
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/hw/virtio/vhost-shadow-virtqueue.h
|
||
|
|
@@ -0,0 +1,28 @@
|
||
|
|
+/*
|
||
|
|
+ * vhost shadow virtqueue
|
||
|
|
+ *
|
||
|
|
+ * SPDX-FileCopyrightText: Red Hat, Inc. 2021
|
||
|
|
+ * SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
|
||
|
|
+ *
|
||
|
|
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
+#ifndef VHOST_SHADOW_VIRTQUEUE_H
|
||
|
|
+#define VHOST_SHADOW_VIRTQUEUE_H
|
||
|
|
+
|
||
|
|
+#include "qemu/event_notifier.h"
|
||
|
|
+
|
||
|
|
+/* Shadow virtqueue to relay notifications */
|
||
|
|
+typedef struct VhostShadowVirtqueue {
|
||
|
|
+ /* Shadow kick notifier, sent to vhost */
|
||
|
|
+ EventNotifier hdev_kick;
|
||
|
|
+ /* Shadow call notifier, sent to vhost */
|
||
|
|
+ EventNotifier hdev_call;
|
||
|
|
+} VhostShadowVirtqueue;
|
||
|
|
+
|
||
|
|
+VhostShadowVirtqueue *vhost_svq_new(void);
|
||
|
|
+
|
||
|
|
+void vhost_svq_free(gpointer vq);
|
||
|
|
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(VhostShadowVirtqueue, vhost_svq_free);
|
||
|
|
+
|
||
|
|
+#endif
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|