aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/init_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/mm/init_32.c')
-rw-r--r--arch/x86/mm/init_32.c53
1 files changed, 16 insertions, 37 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
index c2385d7ae313..85467099d6d3 100644
--- a/arch/x86/mm/init_32.c
+++ b/arch/x86/mm/init_32.c
@@ -423,49 +423,28 @@ static void __init add_one_highpage_init(struct page *page)
423 totalhigh_pages++; 423 totalhigh_pages++;
424} 424}
425 425
426struct add_highpages_data { 426void __init add_highpages_with_active_regions(int nid,
427 unsigned long start_pfn; 427 unsigned long start_pfn, unsigned long end_pfn)
428 unsigned long end_pfn;
429};
430
431static int __init add_highpages_work_fn(unsigned long start_pfn,
432 unsigned long end_pfn, void *datax)
433{ 428{
434 int node_pfn; 429 struct range *range;
435 struct page *page; 430 int nr_range;
436 unsigned long final_start_pfn, final_end_pfn; 431 int i;
437 struct add_highpages_data *data;
438 432
439 data = (struct add_highpages_data *)datax; 433 nr_range = __get_free_all_memory_range(&range, nid, start_pfn, end_pfn);
440 434
441 final_start_pfn = max(start_pfn, data->start_pfn); 435 for (i = 0; i < nr_range; i++) {
442 final_end_pfn = min(end_pfn, data->end_pfn); 436 struct page *page;
443 if (final_start_pfn >= final_end_pfn) 437 int node_pfn;
444 return 0;
445 438
446 for (node_pfn = final_start_pfn; node_pfn < final_end_pfn; 439 for (node_pfn = range[i].start; node_pfn < range[i].end;
447 node_pfn++) { 440 node_pfn++) {
448 if (!pfn_valid(node_pfn)) 441 if (!pfn_valid(node_pfn))
449 continue; 442 continue;
450 page = pfn_to_page(node_pfn); 443 page = pfn_to_page(node_pfn);
451 add_one_highpage_init(page); 444 add_one_highpage_init(page);
445 }
452 } 446 }
453
454 return 0;
455
456} 447}
457
458void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn,
459 unsigned long end_pfn)
460{
461 struct add_highpages_data data;
462
463 data.start_pfn = start_pfn;
464 data.end_pfn = end_pfn;
465
466 work_with_active_regions(nid, add_highpages_work_fn, &data);
467}
468
469#else 448#else
470static inline void permanent_kmaps_init(pgd_t *pgd_base) 449static inline void permanent_kmaps_init(pgd_t *pgd_base)
471{ 450{