IOMMU driver must pick the same IOMMU as that of a Physical Function (PF) for any of its Virtual Functions (VF). It is not practical to list all the VF's in the DMAR scope, as this list could be quite large. Linux also ignores any VF's listed in DMAR. See dmar_pci_bus_notifier() for virtfn handling. Since the driver is looking for the bdf of the VF, it will not find one from searching the DRHD listed in BIOS. As a result, the IOMMU driver associates the VF's under the INCLUDE_ALL iommu incorrectly. This patch looks up the IOMMU of the PF when handling VF's. Cc: David Woodhouse <dwmw2@xxxxxxxxxxxxx> Cc: Joerg Roedel <joro@xxxxxxxxxx> Cc: Ashok Raj <ashok.raj@xxxxxxxxx> Cc: Sainath Grandhi <sainath.grandhi@xxxxxxxxx> Cc: iommu@xxxxxxxxxxxxxxxxxxxxxxxxxx Cc: stable@xxxxxxxxxxxxxxx Signed-off-by: Sainath Grandhi <sainath.grandhi@xxxxxxxxx> Signed-off-by: Ashok Raj <ashok.raj@xxxxxxxxx> --- drivers/iommu/intel-iommu.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index a4407ea..c2e4b5c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -885,6 +885,7 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf struct intel_iommu *iommu; struct device *tmp; struct pci_dev *ptmp, *pdev = NULL; + struct pci_dev *pf_pdev = NULL; u16 segment = 0; int i; @@ -893,6 +894,11 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf if (dev_is_pci(dev)) { pdev = to_pci_dev(dev); + /* + * Always lookup the PF's IOMMU when handling VF's + */ + pf_pdev = pci_physfn(pdev); + dev = &pf_pdev->dev; segment = pci_domain_nr(pdev->bus); } else if (has_acpi_companion(dev)) dev = &ACPI_COMPANION(dev)->dev; @@ -905,6 +911,9 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf for_each_active_dev_scope(drhd->devices, drhd->devices_cnt, i, tmp) { if (tmp == dev) { + if (pdev->is_virtfn) + goto got_pdev; + *bus = drhd->devices[i].bus; *devfn = drhd->devices[i].devfn; goto out; -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html