Commit c5b15255 authored by Sheng Yang's avatar Sheng Yang Committed by David Woodhouse

intel-iommu: Fix enabling snooping feature by mistake

Two defects work together result in KVM device passthrough randomly can't
work:
1. iommu_snooping is not initialized to zero when vm_iommu_init() called.
So it is possible to get a random value.
2. One line added by commit 2c2e2c38("IOMMU Identity Mapping Support")
change the code path, let it bypass domain_update_iommu_cap(), as well as
missing the increment of domain iommu reference count.

The latter is also likely to cause a leak of domains on repeated VMM 
assignment and deassignment.
Signed-off-by: default avatarSheng Yang <sheng@linux.intel.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 33041ec0
...@@ -1505,7 +1505,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain, int segment, ...@@ -1505,7 +1505,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain, int segment,
} }
set_bit(num, iommu->domain_ids); set_bit(num, iommu->domain_ids);
set_bit(iommu->seq_id, &domain->iommu_bmp);
iommu->domains[num] = domain; iommu->domains[num] = domain;
id = num; id = num;
} }
...@@ -3409,6 +3408,7 @@ static int md_domain_init(struct dmar_domain *domain, int guest_width) ...@@ -3409,6 +3408,7 @@ static int md_domain_init(struct dmar_domain *domain, int guest_width)
domain->iommu_count = 0; domain->iommu_count = 0;
domain->iommu_coherency = 0; domain->iommu_coherency = 0;
domain->iommu_snooping = 0;
domain->max_addr = 0; domain->max_addr = 0;
/* always allocate the top pgd */ /* always allocate the top pgd */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment