From: Allen Kay Date: Fri, 14 Oct 2011 19:32:17 +0000 (-0700) Subject: intel-iommu: set iommu_superpage on VM domains to lowest common denominator X-Git-Tag: firefly_0821_release~7541^2~2118 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c46f906e93c81844de1c41e2e6fc1a6a36131c4f;p=firefly-linux-kernel-4.4.55.git intel-iommu: set iommu_superpage on VM domains to lowest common denominator commit 8140a95d228efbcd64d84150e794761a32463947 upstream. set dmar->iommu_superpage field to the smallest common denominator of super page sizes supported by all active VT-d engines. Initialize this field in intel_iommu_domain_init() API so intel_iommu_map() API will be able to use iommu_superpage field to determine the appropriate super page size to use. Signed-off-by: Allen Kay Signed-off-by: David Woodhouse Signed-off-by: Youquan Song Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 4f255c865df8..46fa9eb135cc 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -578,17 +578,18 @@ static void domain_update_iommu_snooping(struct dmar_domain *domain) static void domain_update_iommu_superpage(struct dmar_domain *domain) { - int i, mask = 0xf; + struct dmar_drhd_unit *drhd; + struct intel_iommu *iommu = NULL; + int mask = 0xf; if (!intel_iommu_superpage) { domain->iommu_superpage = 0; return; } - domain->iommu_superpage = 4; /* 1TiB */ - - for_each_set_bit(i, &domain->iommu_bmp, g_num_of_iommus) { - mask |= cap_super_page_val(g_iommus[i]->cap); + /* set iommu_superpage to the smallest common denominator */ + for_each_active_iommu(iommu, drhd) { + mask &= cap_super_page_val(iommu->cap); if (!mask) { break; } @@ -3744,6 +3745,7 @@ static int intel_iommu_domain_init(struct iommu_domain *domain) vm_domain_exit(dmar_domain); return -ENOMEM; } + domain_update_iommu_cap(dmar_domain); domain->priv = dmar_domain; return 0;