Hi Cédric,

>-----Original Message-----
>From: Cédric Le Goater <c...@redhat.com>
>Sent: Friday, November 17, 2023 7:10 PM
>Subject: Re: [PATCH v6 01/21] backends/iommufd: Introduce the iommufd object
>
>Hello,
>
>> +int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t ioas_id,
>hwaddr iova,
>> +                            ram_addr_t size, void *vaddr, bool readonly)
>> +{
>> +    int ret, fd = be->fd;
>> +    struct iommu_ioas_map map = {
>> +        .size = sizeof(map),
>> +        .flags = IOMMU_IOAS_MAP_READABLE |
>> +                 IOMMU_IOAS_MAP_FIXED_IOVA,
>> +        .ioas_id = ioas_id,
>> +        .__reserved = 0,
>> +        .user_va = (uintptr_t)vaddr,
>> +        .iova = iova,
>> +        .length = size,
>> +    };
>> +
>> +    if (!readonly) {
>> +        map.flags |= IOMMU_IOAS_MAP_WRITEABLE;
>> +    }
>> +
>> +    ret = ioctl(fd, IOMMU_IOAS_MAP, &map);
>> +    trace_iommufd_backend_map_dma(fd, ioas_id, iova, size,
>> +                                  vaddr, readonly, ret);
>> +    if (ret) {
>> +        ret = -errno;
>> +        error_report("IOMMU_IOAS_MAP failed: %m");
>> +    }
>> +    return ret;
>> +}
>
>When using a UEFI guest, QEMU reports errors when mapping regions
>in the top PCI space :
>
>   iommufd_backend_map_dma  iommufd=10 ioas=2 iova=0x380000001000
>size=0x3000 addr=0x7fce2c28b000 readonly=0 (-1)
>   qemu-system-x86_64: IOMMU_IOAS_MAP failed: Invalid argument
>   qemu-system-x86_64: vfio_container_dma_map(0x55a21b03a150,
>0x380000001000, 0x3000, 0x7fce2c28b000) = -22 (Invalid argument)
>
>   iommufd_backend_map_dma  iommufd=10 ioas=2 iova=0x380000004000
>size=0x4000 addr=0x7fce2c980000 readonly=0 (-1)
>   qemu-system-x86_64: IOMMU_IOAS_MAP failed: Invalid argument
>   qemu-system-x86_64: vfio_container_dma_map(0x55a21b03a150,
>0x380000004000, 0x4000, 0x7fce2c980000) = -22 (Invalid argument)
>
>This is because IOMMUFD reserved IOVAs areas are :
>
>  [ fee00000 - feefffff ]
>  [ 8000000000 - ffffffffffffffff ] (39 bits address space)
>
>which were allocated when the device was initially attached.
>The topology is basic. Something is wrong.
        
Thanks for your report. This looks a hardware limit of
host IOMMU address width(39) < guest physical address width.

A similar issue with a fix submitted below, ccing related people.
https://lists.gnu.org/archive/html/qemu-devel/2023-11/msg02937.html
It looks the fix will not work for hotplug.

Or below qemu cmdline may help:
"-cpu host,host-phys-bits-limit=39"

Thanks
Zhenzhong

Reply via email to