97 lines
3.5 KiB
Diff
97 lines
3.5 KiB
Diff
|
|
From c9b863e96be5277e775cb424cf8ea34f8f921776 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:45 +0100
|
||
|
|
Subject: [PATCH] virtio: Add vhost_svq_get_vring_addr
|
||
|
|
MIME-Version: 1.0
|
||
|
|
Content-Type: text/plain; charset=UTF-8
|
||
|
|
Content-Transfer-Encoding: 8bit
|
||
|
|
|
||
|
|
It reports the shadow virtqueue address from qemu virtual address space.
|
||
|
|
|
||
|
|
Since this will be different from the guest's vaddr, but the device can
|
||
|
|
access it, SVQ takes special care about its alignment & lack of garbage
|
||
|
|
data. It assumes that IOMMU will work in host_page_size ranges for that.
|
||
|
|
|
||
|
|
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-shadow-virtqueue.c | 29 +++++++++++++++++++++++++++++
|
||
|
|
hw/virtio/vhost-shadow-virtqueue.h | 9 +++++++++
|
||
|
|
2 files changed, 38 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c
|
||
|
|
index 519328445c..573ac0d9cf 100644
|
||
|
|
--- a/hw/virtio/vhost-shadow-virtqueue.c
|
||
|
|
+++ b/hw/virtio/vhost-shadow-virtqueue.c
|
||
|
|
@@ -106,6 +106,35 @@ void vhost_svq_set_svq_call_fd(VhostShadowVirtqueue *svq, int call_fd)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+/**
|
||
|
|
+ * Get the shadow vq vring address.
|
||
|
|
+ * @svq: Shadow virtqueue
|
||
|
|
+ * @addr: Destination to store address
|
||
|
|
+ */
|
||
|
|
+void vhost_svq_get_vring_addr(const VhostShadowVirtqueue *svq,
|
||
|
|
+ struct vhost_vring_addr *addr)
|
||
|
|
+{
|
||
|
|
+ addr->desc_user_addr = (uint64_t)(intptr_t)svq->vring.desc;
|
||
|
|
+ addr->avail_user_addr = (uint64_t)(intptr_t)svq->vring.avail;
|
||
|
|
+ addr->used_user_addr = (uint64_t)(intptr_t)svq->vring.used;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+size_t vhost_svq_driver_area_size(const VhostShadowVirtqueue *svq)
|
||
|
|
+{
|
||
|
|
+ size_t desc_size = sizeof(vring_desc_t) * svq->vring.num;
|
||
|
|
+ size_t avail_size = offsetof(vring_avail_t, ring) +
|
||
|
|
+ sizeof(uint16_t) * svq->vring.num;
|
||
|
|
+
|
||
|
|
+ return ROUND_UP(desc_size + avail_size, qemu_real_host_page_size);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+size_t vhost_svq_device_area_size(const VhostShadowVirtqueue *svq)
|
||
|
|
+{
|
||
|
|
+ size_t used_size = offsetof(vring_used_t, ring) +
|
||
|
|
+ sizeof(vring_used_elem_t) * svq->vring.num;
|
||
|
|
+ return ROUND_UP(used_size, qemu_real_host_page_size);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
/**
|
||
|
|
* Set a new file descriptor for the guest to kick the SVQ and notify for avail
|
||
|
|
*
|
||
|
|
diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h
|
||
|
|
index 9e12f77201..82cea1c3fa 100644
|
||
|
|
--- a/hw/virtio/vhost-shadow-virtqueue.h
|
||
|
|
+++ b/hw/virtio/vhost-shadow-virtqueue.h
|
||
|
|
@@ -11,9 +11,14 @@
|
||
|
|
#define VHOST_SHADOW_VIRTQUEUE_H
|
||
|
|
|
||
|
|
#include "qemu/event_notifier.h"
|
||
|
|
+#include "hw/virtio/virtio.h"
|
||
|
|
+#include "standard-headers/linux/vhost_types.h"
|
||
|
|
|
||
|
|
/* Shadow virtqueue to relay notifications */
|
||
|
|
typedef struct VhostShadowVirtqueue {
|
||
|
|
+ /* Shadow vring */
|
||
|
|
+ struct vring vring;
|
||
|
|
+
|
||
|
|
/* Shadow kick notifier, sent to vhost */
|
||
|
|
EventNotifier hdev_kick;
|
||
|
|
/* Shadow call notifier, sent to vhost */
|
||
|
|
@@ -37,6 +42,10 @@ bool vhost_svq_valid_features(uint64_t features, Error **errp);
|
||
|
|
|
||
|
|
void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *svq, int svq_kick_fd);
|
||
|
|
void vhost_svq_set_svq_call_fd(VhostShadowVirtqueue *svq, int call_fd);
|
||
|
|
+void vhost_svq_get_vring_addr(const VhostShadowVirtqueue *svq,
|
||
|
|
+ struct vhost_vring_addr *addr);
|
||
|
|
+size_t vhost_svq_driver_area_size(const VhostShadowVirtqueue *svq);
|
||
|
|
+size_t vhost_svq_device_area_size(const VhostShadowVirtqueue *svq);
|
||
|
|
|
||
|
|
void vhost_svq_stop(VhostShadowVirtqueue *svq);
|
||
|
|
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|