On Tue, Aug 30, 2016 at 09:31:27AM +0200, 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-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.
Yes - let's do container_of calls as opposed to QOM on data path. > Is the address space likely to change during device lifetime? Can we > cache it in some way?