x86-32, memblock: Make add_highpages honor early reserved ranges
[pandora-kernel.git] / arch / x86 / mm / init_32.c
index c2385d7..8546709 100644 (file)
@@ -423,49 +423,28 @@ static void __init add_one_highpage_init(struct page *page)
        totalhigh_pages++;
 }
 
-struct add_highpages_data {
-       unsigned long start_pfn;
-       unsigned long end_pfn;
-};
-
-static int __init add_highpages_work_fn(unsigned long start_pfn,
-                                        unsigned long end_pfn, void *datax)
+void __init add_highpages_with_active_regions(int nid,
+                        unsigned long start_pfn, unsigned long end_pfn)
 {
-       int node_pfn;
-       struct page *page;
-       unsigned long final_start_pfn, final_end_pfn;
-       struct add_highpages_data *data;
+       struct range *range;
+       int nr_range;
+       int i;
 
-       data = (struct add_highpages_data *)datax;
+       nr_range = __get_free_all_memory_range(&range, nid, start_pfn, end_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 0;
+       for (i = 0; i < nr_range; i++) {
+               struct page *page;
+               int node_pfn;
 
-       for (node_pfn = final_start_pfn; node_pfn < final_end_pfn;
-            node_pfn++) {
-               if (!pfn_valid(node_pfn))
-                       continue;
-               page = pfn_to_page(node_pfn);
-               add_one_highpage_init(page);
+               for (node_pfn = range[i].start; node_pfn < range[i].end;
+                    node_pfn++) {
+                       if (!pfn_valid(node_pfn))
+                               continue;
+                       page = pfn_to_page(node_pfn);
+                       add_one_highpage_init(page);
+               }
        }
-
-       return 0;
-
 }
-
-void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn,
-                                             unsigned long end_pfn)
-{
-       struct add_highpages_data data;
-
-       data.start_pfn = start_pfn;
-       data.end_pfn = end_pfn;
-
-       work_with_active_regions(nid, add_highpages_work_fn, &data);
-}
-
 #else
 static inline void permanent_kmaps_init(pgd_t *pgd_base)
 {