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-bl...@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?