[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC V1 02/12] iommufd: no DMA to BARs
|
From: |
Alex Williamson |
|
Subject: |
Re: [RFC V1 02/12] iommufd: no DMA to BARs |
|
Date: |
Mon, 12 Aug 2024 16:05:35 -0600 |
On Sat, 20 Jul 2024 12:15:27 -0700
Steve Sistare <steven.sistare@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.sistare@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 */
- Re: [RFC V1 02/12] iommufd: no DMA to BARs,
Alex Williamson <=