RFC x86: try to remove arch_get_ram_range
authorYinghai Lu <yhlu.kernel@gmail.com>
Tue, 17 Jun 2008 03:10:55 +0000 (20:10 -0700)
committerIngo Molnar <mingo@elte.hu>
Tue, 8 Jul 2008 10:48:27 +0000 (12:48 +0200)
want to remove arch_get_ram_range, and use early_node_map instead.

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/init_32.c
drivers/pci/intel-iommu.c
include/linux/mm.h
mm/page_alloc.c

index 65d55056b6e781c72b1740dad18747682a2985eb..a0484adbf59db23104dc8a1a91b9a54103a53338 100644 (file)
@@ -298,7 +298,7 @@ struct add_highpages_data {
        unsigned long end_pfn;
 };
 
-static void __init add_highpages_work_fn(unsigned long start_pfn,
+static int __init add_highpages_work_fn(unsigned long start_pfn,
                                         unsigned long end_pfn, void *datax)
 {
        int node_pfn;
@@ -311,7 +311,7 @@ static void __init add_highpages_work_fn(unsigned long start_pfn,
        final_start_pfn = max(start_pfn, data->start_pfn);
        final_end_pfn = min(end_pfn, data->end_pfn);
        if (final_start_pfn >= final_end_pfn)
-               return;
+               return 0;
 
        for (node_pfn = final_start_pfn; node_pfn < final_end_pfn;
             node_pfn++) {
@@ -321,6 +321,8 @@ static void __init add_highpages_work_fn(unsigned long start_pfn,
                add_one_highpage_init(page, node_pfn);
        }
 
+       return 0;
+
 }
 
 void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn,
index 66c0fd21894b155e9db690b65a86bfddffca29c4..bb0642318a959453e9ef0c68190070ac7d9290a4 100644 (file)
@@ -1637,12 +1637,43 @@ static inline int iommu_prepare_rmrr_dev(struct dmar_rmrr_unit *rmrr,
 }
 
 #ifdef CONFIG_DMAR_GFX_WA
-extern int arch_get_ram_range(int slot, u64 *addr, u64 *size);
+struct iommu_prepare_data {
+       struct pci_dev *pdev;
+       int ret;
+};
+
+static int __init iommu_prepare_work_fn(unsigned long start_pfn,
+                                        unsigned long end_pfn, void *datax)
+{
+       struct iommu_prepare_data *data;
+
+       data = (struct iommu_prepare_data *)datax;
+
+       data->ret = iommu_prepare_identity_map(data->pdev,
+                               start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT);
+       return data->ret;
+
+}
+
+static int __init iommu_prepare_with_active_regions(struct pci_dev *pdev)
+{
+       int nid;
+       struct iommu_prepare_data data;
+
+       data.pdev = pdev;
+       data.ret = 0;
+
+       for_each_online_node(nid) {
+               work_with_active_regions(nid, iommu_prepare_work_fn, &data);
+               if (data.ret)
+                       return data.ret;
+       }
+       return data.ret;
+}
+
 static void __init iommu_prepare_gfx_mapping(void)
 {
        struct pci_dev *pdev = NULL;
-       u64 base, size;
-       int slot;
        int ret;
 
        for_each_pci_dev(pdev) {
@@ -1651,17 +1682,9 @@ static void __init iommu_prepare_gfx_mapping(void)
                        continue;
                printk(KERN_INFO "IOMMU: gfx device %s 1-1 mapping\n",
                        pci_name(pdev));
-               slot = arch_get_ram_range(0, &base, &size);
-               while (slot >= 0) {
-                       ret = iommu_prepare_identity_map(pdev,
-                                       base, base + size);
-                       if (ret)
-                               goto error;
-                       slot = arch_get_ram_range(slot, &base, &size);
-               }
-               continue;
-error:
-               printk(KERN_ERR "IOMMU: mapping reserved region failed\n");
+               ret = iommu_prepare_with_active_regions(pdev);
+               if (ret)
+                       printk(KERN_ERR "IOMMU: mapping reserved region failed\n");
        }
 }
 #endif
index 3d647b24041fd90447d514f28e3c5f0c7969caad..cf1cd3a2ed7870c6faa00a3452ab7ef1339d33ee 100644 (file)
@@ -1011,7 +1011,7 @@ extern unsigned long find_min_pfn_with_active_regions(void);
 extern unsigned long find_max_pfn_with_active_regions(void);
 extern void free_bootmem_with_active_regions(int nid,
                                                unsigned long max_low_pfn);
-typedef void (*work_fn_t)(unsigned long, unsigned long, void *);
+typedef int (*work_fn_t)(unsigned long, unsigned long, void *);
 extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);
 extern void sparse_memory_present_with_active_regions(int nid);
 #ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
index 41c6e3aa059f885ee2f36b59314a4e750e620b81..e25b6b24f8445a6b065683879baecafe4fdf5bb8 100644 (file)
@@ -2932,10 +2932,14 @@ void __init free_bootmem_with_active_regions(int nid,
 void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data)
 {
        int i;
+       int ret;
 
-       for_each_active_range_index_in_nid(i, nid)
-               work_fn(early_node_map[i].start_pfn, early_node_map[i].end_pfn,
-                       data);
+       for_each_active_range_index_in_nid(i, nid) {
+               ret = work_fn(early_node_map[i].start_pfn,
+                             early_node_map[i].end_pfn, data);
+               if (ret)
+                       break;
+       }
 }
 /**
  * sparse_memory_present_with_active_regions - Call memory_present for each active range