Re: Re[PATCH v1] iommu: Skip mapping at address 0x0 if it already exists

From: Elisabetta Bruno

Date: Sun Apr 05 2026 - 11:02:45 EST


On Sun, 22 Feb 2026 00:50:50 +0100 Antheas Kapenekakis <lkml@xxxxxxxxxxx> wrote:
> Commit 789a5913b29c ("iommu/amd: Use the generic iommu page table")
> introduces the shared iommu page table for AMD IOMMU. Some bioses
> contain an identity mapping for address 0x0, which is not parsed
> properly (e.g., certain Strix Halo devices). This causes the DMA
> components of the device to fail to initialize (e.g., the NVMe SSD
> controller), leading to a failed post.
>
> The failure is caused by iommu_create_device_direct_mappings(), which
> is the new mapping implementation. In it, address aliasing is handled
> via the following check:
>
> ```
> phys_addr = iommu_iova_to_phys(domain, addr);
> if (!phys_addr) {
> map_size += pg_size;
> continue;
> }
> ````
>
> Obviously, the iommu_iova_to_phys() signature is faulty and aliases
> unmapped and 0 together, causing the allocation code to try to
> re-allocate the 0 address per device. However, it has too many
> instantiations to fix. Therefore, catch ret == -EADDRINUSE only when
> addr == 0 and, instead of bailing, skip the mapping and print a warning.
>
> Closes: https://www.reddit.com/r/cachyos/comments/1r5sgr6/freeze_on_boot_after_kernel_update_to_619_fixed/
> Fixes: 789a5913b29c ("iommu/amd: Use the generic iommu page table")
> Signed-off-by: Antheas Kapenekakis <lkml@xxxxxxxxxxx>

Hi all,

As I am seeing this still marked as pending fix, hopefully some real
world testing might help.

I can confirm this patch successfully resolves the IO_PAGE_FAULT boot
regression. Without this fix, my system requires the iommu=pt
parameter to successfully boot.

I have verified the downstream patch used by Fedora in kernel 6.19.8
and up is stable and working as intended on the following setup:

* CPU: AMD Ryzen 7 9800X3D
* Motherboard: B650M DS3H
* GPU: AMD Radeon RX 9070
* OS: Fedora Kinoite (Bluewhale custom OCI)
* Environment: Secure Boot Enabled

Tested-by: Elisabetta Bruno <artisticdesign@xxxxxxxxx>

> ---
> drivers/iommu/iommu.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index 4926a43118e6..d424b7124311 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -1224,6 +1224,11 @@ static int iommu_create_device_direct_mappings(struct iommu_domain *domain,
> ret = iommu_map(domain, addr - map_size,
> addr - map_size, map_size,
> entry->prot, GFP_KERNEL);
> + if (ret == -EADDRINUSE && addr - map_size == 0) {
> + dev_warn_once(dev,
> + "iommu: identity mapping at addr 0x0 already exists, skipping\n");
> + ret = 0;
> + }
> if (ret)
> goto out;
> map_size = 0;
>
> base-commit: 57d76ceccee4b497eb835831206b50e72915a501
> --
> 2.52.0