diff options
author | Jiang Liu <jiang.liu@linux.intel.com> | 2014-02-19 01:07:22 -0500 |
---|---|---|
committer | Joerg Roedel <joro@8bytes.org> | 2014-03-04 11:50:59 -0500 |
commit | 816997d03bca9fabcee65f3481eb0297103eceb7 (patch) | |
tree | 73c64708261a149794863fc1fe31ef62e563c8f0 | |
parent | 989d51fc99e9df4fb47f34bccf162c59aa386e8c (diff) |
iommu/vt-d: Avoid caching stale domain_device_info and fix memory leak
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>
-rw-r--r-- | drivers/iommu/intel-iommu.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 52be7555b0df..f75d3aef6de6 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -3600,14 +3600,14 @@ static int device_notifier(struct notifier_block *nb, | |||
3600 | struct pci_dev *pdev = to_pci_dev(dev); | 3600 | struct pci_dev *pdev = to_pci_dev(dev); |
3601 | struct dmar_domain *domain; | 3601 | struct dmar_domain *domain; |
3602 | 3602 | ||
3603 | if (iommu_no_mapping(dev)) | 3603 | if (iommu_dummy(pdev)) |
3604 | return 0; | 3604 | return 0; |
3605 | 3605 | ||
3606 | domain = find_domain(pdev); | 3606 | domain = find_domain(pdev); |
3607 | if (!domain) | 3607 | if (!domain) |
3608 | return 0; | 3608 | return 0; |
3609 | 3609 | ||
3610 | if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through) { | 3610 | if (action == BUS_NOTIFY_UNBOUND_DRIVER) { |
3611 | domain_remove_one_dev_info(domain, pdev); | 3611 | domain_remove_one_dev_info(domain, pdev); |
3612 | 3612 | ||
3613 | if (!(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE) && | 3613 | if (!(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE) && |