From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41101) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1befsC-0001wX-VP for qemu-devel@nongnu.org; Tue, 30 Aug 2016 06:02:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1befsA-0005t1-Hn for qemu-devel@nongnu.org; Tue, 30 Aug 2016 06:02:27 -0400 Date: Tue, 30 Aug 2016 13:02:14 +0300 From: "Michael S. Tsirkin" Message-ID: <20160830130128-mutt-send-email-mst@kernel.org> References: <1472526419-5900-1-git-send-email-jasowang@redhat.com> <1472526419-5900-3-git-send-email-jasowang@redhat.com> <20160830093127.49463d9d.cornelia.huck@de.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160830093127.49463d9d.cornelia.huck@de.ibm.com> Subject: Re: [Qemu-devel] [PATCH for 2.8 02/11] virtio: convert to use DMA api List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Cornelia Huck Cc: Jason Wang , qemu-devel@nongnu.org, pbonzini@redhat.com, peterx@redhat.com, wexu@redhat.com, vkaplans@redhat.com, Stefan Hajnoczi , Kevin Wolf , Amit Shah , qemu-block@nongnu.org On Tue, Aug 30, 2016 at 09:31:27AM +0200, Cornelia Huck wrote: > On Tue, 30 Aug 2016 11:06:50 +0800 > Jason Wang 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 > > Cc: Stefan Hajnoczi > > Cc: Kevin Wolf > > Cc: Amit Shah > > Cc: Paolo Bonzini > > Cc: qemu-block@nongnu.org > > Signed-off-by: Jason Wang > > --- > > 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?