On Wed, Mar 01, 2017 at 12:10:40PM +0800, Jason Wang wrote: > Commit c611c76417f5 ("virtio: add MemoryListener to cache ring > translations") registers a memory listener to dma_as. This may not > work when IOMMU is enabled: dma_as(bus_master_as) were initialized in > pcibus_machine_done() after virtio_realize(). This will cause a > segfault. Fixing this by using pci_device_iommu_address_space() > instead to make sure address space were initialized at this time. > > With this fix, IOMMU device were required to be initialized before any > virtio-pci devices. > > Fixes: c611c76417f5 ("virtio: add MemoryListener to cache ring translations") > Cc: Paolo Bonzini <pbonz...@redhat.com> > Signed-off-by: Jason Wang <jasow...@redhat.com>
This is very ugly. I guess it's better than broken IOMMU ... Paolo? > --- > hw/virtio/virtio-pci.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index 5ce42af..b76f3f6 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -1153,7 +1153,7 @@ static AddressSpace *virtio_pci_get_dma_as(DeviceState > *d) > VirtIOPCIProxy *proxy = VIRTIO_PCI(d); > PCIDevice *dev = &proxy->pci_dev; > > - return pci_get_address_space(dev); > + return pci_device_iommu_address_space(dev); > } > > static int virtio_pci_add_mem_cap(VirtIOPCIProxy *proxy, > -- > 2.7.4