]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/amd: Fix clone_alias() to use the original device's devid
authorVasant Hegde <vasant.hegde@amd.com>
Wed, 1 Apr 2026 08:00:17 +0000 (08:00 +0000)
committerJoerg Roedel <joerg.roedel@amd.com>
Thu, 2 Apr 2026 07:31:24 +0000 (09:31 +0200)
Currently clone_alias() assumes first argument (pdev) is always the
original device pointer. This function is called by
pci_for_each_dma_alias() which based on topology decides to send
original or alias device details in first argument.

This meant that the source devid used to look up and copy the DTE
may be incorrect, leading to wrong or stale DTE entries being
propagated to alias device.

Fix this by passing the original pdev as the opaque data argument to
both the direct clone_alias() call and pci_for_each_dma_alias(). Inside
clone_alias(), retrieve the original device from data and compute devid
from it.

Fixes: 3332364e4ebc ("iommu/amd: Support multiple PCI DMA aliases in device table")
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/amd/iommu.c

index 81c4d77338722e50e0b550f02cae7ede992f9475..b6acb519fea5668660d793722fdd098e181cb606 100644 (file)
@@ -403,11 +403,12 @@ struct iommu_dev_data *search_dev_data(struct amd_iommu *iommu, u16 devid)
        return NULL;
 }
 
-static int clone_alias(struct pci_dev *pdev, u16 alias, void *data)
+static int clone_alias(struct pci_dev *pdev_origin, u16 alias, void *data)
 {
        struct dev_table_entry new;
        struct amd_iommu *iommu;
        struct iommu_dev_data *dev_data, *alias_data;
+       struct pci_dev *pdev = data;
        u16 devid = pci_dev_id(pdev);
        int ret = 0;
 
@@ -454,9 +455,9 @@ static void clone_aliases(struct amd_iommu *iommu, struct device *dev)
         * part of the PCI DMA aliases if it's bus differs
         * from the original device.
         */
-       clone_alias(pdev, iommu->pci_seg->alias_table[pci_dev_id(pdev)], NULL);
+       clone_alias(pdev, iommu->pci_seg->alias_table[pci_dev_id(pdev)], pdev);
 
-       pci_for_each_dma_alias(pdev, clone_alias, NULL);
+       pci_for_each_dma_alias(pdev, clone_alias, pdev);
 }
 
 static void setup_aliases(struct amd_iommu *iommu, struct device *dev)