[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 08/16] vhost-user: send guest physical address of
From: |
Wei Wang |
Subject: |
[Qemu-devel] [PATCH v2 08/16] vhost-user: send guest physical address of virtqueues to the slave |
Date: |
Fri, 12 May 2017 16:35:40 +0800 |
In the vhost-pci case, the slave needs the master side guest physical
address, rather than the qemu virtual address.
Signed-off-by: Wei Wang <address@hidden>
---
hw/virtio/vhost.c | 63 ++++++++++++++++++++++++++++++++---------------
include/hw/virtio/vhost.h | 2 ++
2 files changed, 45 insertions(+), 20 deletions(-)
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 613494d..1ce7b92 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -25,6 +25,7 @@
#include "exec/address-spaces.h"
#include "hw/virtio/virtio-bus.h"
#include "hw/virtio/virtio-access.h"
+#include "hw/virtio/vhost-user.h"
#include "migration/migration.h"
#include "sysemu/dma.h"
@@ -994,6 +995,12 @@ out:
rcu_read_unlock();
}
+bool vhost_pci_enabled(struct vhost_dev *dev)
+{
+ return ((dev->protocol_features &
+ (1ULL << VHOST_USER_PROTOCOL_F_VHOST_PCI)) != 0);
+}
+
static int vhost_virtqueue_start(struct vhost_dev *dev,
struct VirtIODevice *vdev,
struct vhost_virtqueue *vq,
@@ -1037,26 +1044,38 @@ static int vhost_virtqueue_start(struct vhost_dev *dev,
}
}
- vq->desc_size = s = l = virtio_queue_get_desc_size(vdev, idx);
vq->desc_phys = a = virtio_queue_get_desc_addr(vdev, idx);
- vq->desc = vhost_memory_map(dev, a, &l, 0);
- if (!vq->desc || l != s) {
- r = -ENOMEM;
- goto fail_alloc_desc;
+ if (vhost_pci_enabled(dev)) {
+ vq->desc = (void *)a;
+ } else {
+ vq->desc_size = s = l = virtio_queue_get_desc_size(vdev, idx);
+ vq->desc = cpu_physical_memory_map(a, &l, 0);
+ if (!vq->desc || l != s) {
+ r = -ENOMEM;
+ goto fail_alloc_desc;
+ }
}
vq->avail_size = s = l = virtio_queue_get_avail_size(vdev, idx);
vq->avail_phys = a = virtio_queue_get_avail_addr(vdev, idx);
- vq->avail = vhost_memory_map(dev, a, &l, 0);
- if (!vq->avail || l != s) {
- r = -ENOMEM;
- goto fail_alloc_avail;
+ if (vhost_pci_enabled(dev)) {
+ vq->avail = (void *)a;
+ } else {
+ vq->avail = cpu_physical_memory_map(a, &l, 0);
+ if (!vq->avail || l != s) {
+ r = -ENOMEM;
+ goto fail_alloc_avail;
+ }
}
vq->used_size = s = l = virtio_queue_get_used_size(vdev, idx);
vq->used_phys = a = virtio_queue_get_used_addr(vdev, idx);
- vq->used = vhost_memory_map(dev, a, &l, 1);
- if (!vq->used || l != s) {
- r = -ENOMEM;
- goto fail_alloc_used;
+ if (vhost_pci_enabled(dev)) {
+ vq->used = (void *)a;
+ } else {
+ vq->used = cpu_physical_memory_map(a, &l, 1);
+ if (!vq->used || l != s) {
+ r = -ENOMEM;
+ goto fail_alloc_used;
+ }
}
r = vhost_virtqueue_set_addr(dev, vq, vhost_vq_index, dev->log_enabled);
@@ -1139,13 +1158,17 @@ static void vhost_virtqueue_stop(struct vhost_dev *dev,
!virtio_is_big_endian(vdev),
vhost_vq_index);
}
-
- vhost_memory_unmap(dev, vq->used, virtio_queue_get_used_size(vdev, idx),
- 1, virtio_queue_get_used_size(vdev, idx));
- vhost_memory_unmap(dev, vq->avail, virtio_queue_get_avail_size(vdev, idx),
- 0, virtio_queue_get_avail_size(vdev, idx));
- vhost_memory_unmap(dev, vq->desc, virtio_queue_get_desc_size(vdev, idx),
- 0, virtio_queue_get_desc_size(vdev, idx));
+ if (!vhost_pci_enabled(dev)) {
+ cpu_physical_memory_unmap(vq->used,
+ virtio_queue_get_used_size(vdev, idx),
+ 1, virtio_queue_get_used_size(vdev, idx));
+ cpu_physical_memory_unmap(vq->avail,
+ virtio_queue_get_avail_size(vdev, idx),
+ 0, virtio_queue_get_avail_size(vdev, idx));
+ cpu_physical_memory_unmap(vq->desc,
+ virtio_queue_get_desc_size(vdev, idx),
+ 0, virtio_queue_get_desc_size(vdev, idx));
+ }
}
static void vhost_eventfd_add(MemoryListener *listener,
diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
index 40ba87e..09e02d8 100644
--- a/include/hw/virtio/vhost.h
+++ b/include/hw/virtio/vhost.h
@@ -107,4 +107,6 @@ int vhost_net_set_backend(struct vhost_dev *hdev,
struct vhost_vring_file *file);
void vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write);
+
+bool vhost_pci_enabled(struct vhost_dev *dev);
#endif
--
2.7.4
- [Qemu-devel] [PATCH v2 00/16] Vhost-pci for inter-VM communication, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 01/16] vhost-user: share the vhost-user protocol related structures, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 02/16] vl: add the vhost-pci-slave command line option, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 03/16] vhost-pci-slave: create a vhost-user slave to support vhost-pci, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 04/16] vhost-pci-net: add vhost-pci-net, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 07/16] vhost-user: send device id to the slave, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 05/16] vhost-pci-net-pci: add vhost-pci-net-pci, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 06/16] virtio: add inter-vm notification support, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 08/16] vhost-user: send guest physical address of virtqueues to the slave,
Wei Wang <=
- [Qemu-devel] [PATCH v2 09/16] vhost-user: send VHOST_USER_SET_VHOST_PCI_START/STOP, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 10/16] vhost-pci-net: send the negotiated feature bits to the master, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 11/16] vhost-user: add asynchronous read for the vhost-user master, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 12/16] vhost-user: handling VHOST_USER_SET_FEATURES, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 13/16] vhost-pci-slave: add "reset_virtio", Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 14/16] vhost-pci-slave: add support to delete a vhost-pci device, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 15/16] vhost-pci-net: tell the driver that it is ready to send packets, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 16/16] vl: enable vhost-pci-slave, Wei Wang, 2017/05/12
- Re: [Qemu-devel] [PATCH v2 00/16] Vhost-pci for inter-VM communication, no-reply, 2017/05/12