]> git.karo-electronics.de Git - linux-beck.git/commitdiff
iommu/vt-d: Avoid caching stale domain_device_info and fix memory leak
authorJiang Liu <jiang.liu@linux.intel.com>
Wed, 19 Feb 2014 06:07:22 +0000 (14:07 +0800)
committerJoerg Roedel <joro@8bytes.org>
Tue, 4 Mar 2014 16:50:59 +0000 (17:50 +0100)
Function device_notifier() in intel-iommu.c fails to remove
device_domain_info data structures for PCI devices if they are
associated with si_domain because iommu_no_mapping() returns true
for those PCI devices. This will cause memory leak and caching of
stale information in domain->devices list.

So fix the issue by not calling iommu_no_mapping() and skipping check
of iommu_pass_through.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
drivers/iommu/intel-iommu.c

index 52be7555b0df375d7d56bfe443a00ddc3a8dbd4c..f75d3aef6de6947397b0103898877f1fb283e3e2 100644 (file)
@@ -3600,14 +3600,14 @@ static int device_notifier(struct notifier_block *nb,
        struct pci_dev *pdev = to_pci_dev(dev);
        struct dmar_domain *domain;
 
-       if (iommu_no_mapping(dev))
+       if (iommu_dummy(pdev))
                return 0;
 
        domain = find_domain(pdev);
        if (!domain)
                return 0;
 
-       if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through) {
+       if (action == BUS_NOTIFY_UNBOUND_DRIVER) {
                domain_remove_one_dev_info(domain, pdev);
 
                if (!(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE) &&