On Wed, Jul 05, 2023 at 04:52:09AM +0000, Duan, Zhenzhong wrote: > Hi Eric, > > >-----Original Message----- > >From: Eric Auger <eric.au...@redhat.com> > >Sent: Tuesday, July 4, 2023 7:15 PM > >Subject: [PATCH 1/2] virtio-iommu: Fix 64kB host page size VFIO device > >assignment > > > >When running on a 64kB page size host and protecting a VFIO device > >with the virtio-iommu, qemu crashes with this kind of message: > > > >qemu-kvm: virtio-iommu page mask 0xfffffffffffff000 is incompatible > >with mask 0x20010000 > > Does 0x20010000 mean only 512MB and 64KB super page mapping is > supported for host iommu hw? 4KB mapping not supported?
It's not a restriction by the HW IOMMU, but the host kernel. An Arm SMMU can implement 4KB, 16KB and/or 64KB granules, but the host kernel only advertises through VFIO the granule corresponding to host PAGE_SIZE. This restriction is done by arm_lpae_restrict_pgsizes() in order to choose a page size when a device is driven by the host. > > There is a check in guest kernel side hint only 4KB is supported, with > this patch we force viommu->pgsize_bitmap to 0x20010000 > and fail below check? Does this device work in guest? > Please correct me if I understand wrong. Right, a guest using 4KB pages under a host that uses 64KB is not supported, because if the guest attempts to dma_map a 4K page, the IOMMU cannot create a mapping small enough, the mapping would have to spill over neighbouring guest memory. One possible solution would be supporting multiple page granules. If we added a page granule negotiation through VFIO and virtio-iommu then the guest could pick the page size it wants. But this requires changes to Linux UAPI so isn't a priority at the moment, because we're trying to enable nesting which would support 64K-host/4K-guest as well. See also the discussion on the patch that introduced the guest check https://lore.kernel.org/linux-iommu/20200318114047.1518048-1-jean-phili...@linaro.org/ Thanks, Jean