On Sat, 20 Jul 2024 12:15:27 -0700 Steve Sistare <steven.sist...@oracle.com> wrote:
> Do not map VFIO PCI BARs for DMA. This stops a raft of warnings of the > following form at QEMU start time when using -object iommufd: > > qemu-kvm: warning: IOMMU_IOAS_MAP failed: Bad address, PCI BAR? > qemu-kvm: vfio_container_dma_map(0x555558282db0, 0x8800010000, 0x4000, > 0x7ffff7ff0000) = -14 (Bad address) NAK. These mappings are required for P2P DMA between devices. This is currently a gap in IOMMUFD support that it doesn't have parity to legacy vfio containers for these mappings. Thanks, Alex > Signed-off-by: Steve Sistare <steven.sist...@oracle.com> > --- > hw/vfio/common.c | 3 ++- > hw/vfio/helpers.c | 1 + > include/exec/memory.h | 1 + > 3 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index da2e0ec..403d45a 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -248,7 +248,8 @@ static bool > vfio_listener_skipped_section(MemoryRegionSection *section) > * are never accessed by the CPU and beyond the address width of > * some IOMMU hardware. TODO: VFIO should tell us the IOMMU > width. > */ > - section->offset_within_address_space & (1ULL << 63); > + section->offset_within_address_space & (1ULL << 63) || > + section->mr->no_dma; > } > > /* Called with rcu_read_lock held. */ > diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c > index b14edd4..e4cfdd2 100644 > --- a/hw/vfio/helpers.c > +++ b/hw/vfio/helpers.c > @@ -435,6 +435,7 @@ int vfio_region_mmap(VFIORegion *region) > memory_region_owner(region->mem), > name, region->mmaps[i].size, > region->mmaps[i].mmap); > + region->mmaps[i].mem.no_dma = true; > g_free(name); > memory_region_add_subregion(region->mem, region->mmaps[i].offset, > ®ion->mmaps[i].mem); > diff --git a/include/exec/memory.h b/include/exec/memory.h > index ea03ef2..850cc8c 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -794,6 +794,7 @@ struct MemoryRegion { > bool unmergeable; > uint8_t dirty_log_mask; > bool is_iommu; > + bool no_dma; > RAMBlock *ram_block; > Object *owner; > /* owner as TYPE_DEVICE. Used for re-entrancy checks in MR access > hotpath */