On 2016年08月30日 15:31, Cornelia Huck wrote:
On Tue, 30 Aug 2016 11:06:50 +0800
Jason Wang <jasow...@redhat.com> wrote:

Currently, all virtio devices bypass IOMMU completely. This is because
address_space_memory is assumed and used during DMA emulation. This
patch converts the virtio core API to use DMA API. This idea is

- introducing a new transport specific helper to query the dma address
   space. (only pci version is implemented).
- query and use this address space during virtio device guest memory
   accessing when iommu platform (VIRTIO_F_IOMMU_PLATFORM) was enabled
   for this device.

Cc: Michael S. Tsirkin <m...@redhat.com>
Cc: Stefan Hajnoczi <stefa...@redhat.com>
Cc: Kevin Wolf <kw...@redhat.com>
Cc: Amit Shah <amit.s...@redhat.com>
Cc: Paolo Bonzini <pbonz...@redhat.com>
Cc: qemu-block@nongnu.org
Signed-off-by: Jason Wang <jasow...@redhat.com>
---
  hw/block/virtio-blk.c             |  2 +-
  hw/char/virtio-serial-bus.c       |  3 +-
  hw/scsi/virtio-scsi.c             |  4 ++-
  hw/virtio/virtio-pci.c            | 14 +++++++++
  hw/virtio/virtio.c                | 62 ++++++++++++++++++++++++---------------
  include/hw/virtio/virtio-access.h | 43 ++++++++++++++++++++-------
  include/hw/virtio/virtio-bus.h    |  1 +
  include/hw/virtio/virtio.h        |  8 +++--
  8 files changed, 98 insertions(+), 39 deletions(-)

diff --git a/include/hw/virtio/virtio-access.h 
b/include/hw/virtio/virtio-access.h
index 440b455..4071dad 100644
--- a/include/hw/virtio/virtio-access.h
+++ b/include/hw/virtio/virtio-access.h
@@ -17,12 +17,25 @@
  #define QEMU_VIRTIO_ACCESS_H

  #include "hw/virtio/virtio.h"
+#include "hw/virtio/virtio-bus.h"
  #include "exec/address-spaces.h"

  #if defined(TARGET_PPC64) || defined(TARGET_ARM)
  #define LEGACY_VIRTIO_IS_BIENDIAN 1
  #endif

+static inline AddressSpace *virtio_get_dma_as(VirtIODevice *vdev)
+{
+    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
+    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+
+    if (virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM) &&
+        k->get_dma_as) {
+        return k->get_dma_as(qbus->parent);
+    }
+    return &address_space_memory;
+}
One thing I'm a bit worried about is that we're introducing a check
even if we know that the device will never support
VIRTIO_F_IOMMU_PLATFORM (i.e. virtio-ccw). The qom incantations will
add cycles to any invocation of this.

Is the address space likely to change during device lifetime? Can we
cache it in some way?


I think so, we can cache it in vdev and set it during features set.

Then we can avoid qom stuffs during data path.


Reply via email to