瀏覽代碼

[PATCH] x86_64: Fix off by one in IOMMU check

Fix off by one when checking if the machine has enougn memory to need IOMMU
This caused the IOMMUs to be needlessly enabled for mem=4G

Based on a patch from Jon Mason

Signed-off-by: jdmason@us.ibm.com
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Andi Kleen 19 年之前
父節點
當前提交
ca8642f606
共有 4 個文件被更改,包括 6 次插入4 次删除
  1. 2 1
      arch/x86_64/kernel/aperture.c
  2. 2 1
      arch/x86_64/kernel/io_apic.c
  3. 1 1
      arch/x86_64/kernel/pci-gart.c
  4. 1 1
      arch/x86_64/mm/init.c

+ 2 - 1
arch/x86_64/kernel/aperture.c

@@ -23,6 +23,7 @@
 #include <asm/io.h>
 #include <asm/io.h>
 #include <asm/proto.h>
 #include <asm/proto.h>
 #include <asm/pci-direct.h>
 #include <asm/pci-direct.h>
+#include <asm/dma.h>
 
 
 int iommu_aperture;
 int iommu_aperture;
 int iommu_aperture_disabled __initdata = 0;
 int iommu_aperture_disabled __initdata = 0;
@@ -247,7 +248,7 @@ void __init iommu_hole_init(void)
 		/* Got the aperture from the AGP bridge */
 		/* Got the aperture from the AGP bridge */
 	} else if (swiotlb && !valid_agp) {
 	} else if (swiotlb && !valid_agp) {
 		/* Do nothing */
 		/* Do nothing */
-	} else if ((!no_iommu && end_pfn >= 0xffffffff>>PAGE_SHIFT) ||
+	} else if ((!no_iommu && end_pfn >= MAX_DMA32_PFN) ||
 		   force_iommu ||
 		   force_iommu ||
 		   valid_agp ||
 		   valid_agp ||
 		   fallback_aper_force) { 
 		   fallback_aper_force) { 

+ 2 - 1
arch/x86_64/kernel/io_apic.c

@@ -37,6 +37,7 @@
 #include <asm/proto.h>
 #include <asm/proto.h>
 #include <asm/mach_apic.h>
 #include <asm/mach_apic.h>
 #include <asm/acpi.h>
 #include <asm/acpi.h>
+#include <asm/dma.h>
 
 
 #define __apicdebuginit  __init
 #define __apicdebuginit  __init
 
 
@@ -281,7 +282,7 @@ void __init check_ioapic(void)
 				switch (vendor) { 
 				switch (vendor) { 
 				case PCI_VENDOR_ID_VIA:
 				case PCI_VENDOR_ID_VIA:
 #ifdef CONFIG_GART_IOMMU
 #ifdef CONFIG_GART_IOMMU
-					if ((end_pfn >= (0xffffffff>>PAGE_SHIFT) ||
+					if ((end_pfn > MAX_DMA32_PFN ||
 					     force_iommu) &&
 					     force_iommu) &&
 					    !iommu_aperture_allowed) {
 					    !iommu_aperture_allowed) {
 						printk(KERN_INFO
 						printk(KERN_INFO

+ 1 - 1
arch/x86_64/kernel/pci-gart.c

@@ -804,7 +804,7 @@ static int __init pci_iommu_init(void)
 	} 
 	} 
 	
 	
 	if (no_iommu ||
 	if (no_iommu ||
-	    (!force_iommu && end_pfn < 0xffffffff>>PAGE_SHIFT) ||
+	    (!force_iommu && (end_pfn-1) < 0xffffffff>>PAGE_SHIFT) ||
 	    !iommu_aperture ||
 	    !iommu_aperture ||
 	    (no_agp && init_k8_gatt(&info) < 0)) {
 	    (no_agp && init_k8_gatt(&info) < 0)) {
 		printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n"); 
 		printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n"); 

+ 1 - 1
arch/x86_64/mm/init.c

@@ -424,7 +424,7 @@ void __init mem_init(void)
 
 
 #ifdef CONFIG_SWIOTLB
 #ifdef CONFIG_SWIOTLB
 	if (!iommu_aperture &&
 	if (!iommu_aperture &&
-	    (end_pfn >= 0xffffffff>>PAGE_SHIFT || force_iommu))
+	    ((end_pfn-1) >= 0xffffffff>>PAGE_SHIFT || force_iommu))
 	       swiotlb = 1;
 	       swiotlb = 1;
 	if (swiotlb)
 	if (swiotlb)
 		swiotlb_init();	
 		swiotlb_init();