Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

intel-iommu: intel_iommu_map_range failed at very end of address space

intel_iommu_map_range() doesn't allow allocation at the very end of the
address space; that code has been simplified and corrected.

Signed-off-by: Tom Lyon <pugs@cisco.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

authored by

Tom Lyon and committed by
David Woodhouse
8954da1f a99c47a2

+3 -8
+3 -8
drivers/pci/intel-iommu.c
··· 3626 3626 { 3627 3627 struct dmar_domain *dmar_domain = domain->priv; 3628 3628 u64 max_addr; 3629 - int addr_width; 3630 3629 int prot = 0; 3631 3630 int ret; 3632 3631 ··· 3638 3639 3639 3640 max_addr = iova + size; 3640 3641 if (dmar_domain->max_addr < max_addr) { 3641 - int min_agaw; 3642 3642 u64 end; 3643 3643 3644 3644 /* check if minimum agaw is sufficient for mapped address */ 3645 - min_agaw = vm_domain_min_agaw(dmar_domain); 3646 - addr_width = agaw_to_width(min_agaw); 3647 - end = DOMAIN_MAX_ADDR(addr_width); 3648 - end = end & VTD_PAGE_MASK; 3645 + end = __DOMAIN_MAX_ADDR(dmar_domain->gaw) + 1; 3649 3646 if (end < max_addr) { 3650 - printk(KERN_ERR "%s: iommu agaw (%d) is not " 3647 + printk(KERN_ERR "%s: iommu width (%d) is not " 3651 3648 "sufficient for the mapped address (%llx)\n", 3652 - __func__, min_agaw, max_addr); 3649 + __func__, dmar_domain->gaw, max_addr); 3653 3650 return -EFAULT; 3654 3651 } 3655 3652 dmar_domain->max_addr = max_addr;