Relax the vIOMMU migration blocker when the underlying IOMMU reports DMA translation disabled. When it is disabled there will be no DMA mappings via the vIOMMU and the guest can only use it for Interrupt Remapping.
The latter is done via vfio_viommu_preset() return value where in addition to validating that the address space is memory, we also check whether the vIOMMU backing the PCI device has DMA translation on. It is assumed to be enabled, if the IOMMU model does not support toggling on/off the dma-translation property. Intel IOMMU right now is the only case supporting, although AMD IOMMU can in theory provide the same functionality. Signed-off-by: Joao Martins <joao.m.mart...@oracle.com> --- hw/vfio/common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index fa8fd949b1cf..17c1d882e221 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -419,7 +419,8 @@ static bool vfio_viommu_preset(void) VFIOAddressSpace *space; QLIST_FOREACH(space, &vfio_address_spaces, list) { - if (space->as != &address_space_memory) { + if ((space->as != &address_space_memory) && + !space->no_dma_translation) { return true; } } -- 2.17.2