diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 50 |
1 files changed, 15 insertions, 35 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8c9b34674d83..f2cd7450fa76 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -3667,46 +3667,26 @@ int __init add_from_early_node_map(struct range *range, int az, | |||
| 3667 | void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, | 3667 | void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, |
| 3668 | u64 goal, u64 limit) | 3668 | u64 goal, u64 limit) |
| 3669 | { | 3669 | { |
| 3670 | int i; | ||
| 3671 | void *ptr; | 3670 | void *ptr; |
| 3671 | u64 addr; | ||
| 3672 | 3672 | ||
| 3673 | if (limit > get_max_mapped()) | 3673 | if (limit > memblock.current_limit) |
| 3674 | limit = get_max_mapped(); | 3674 | limit = memblock.current_limit; |
| 3675 | 3675 | ||
| 3676 | /* need to go over early_node_map to find out good range for node */ | 3676 | addr = find_memory_core_early(nid, size, align, goal, limit); |
| 3677 | for_each_active_range_index_in_nid(i, nid) { | ||
| 3678 | u64 addr; | ||
| 3679 | u64 ei_start, ei_last; | ||
| 3680 | 3677 | ||
| 3681 | ei_last = early_node_map[i].end_pfn; | 3678 | if (addr == MEMBLOCK_ERROR) |
| 3682 | ei_last <<= PAGE_SHIFT; | 3679 | return NULL; |
| 3683 | ei_start = early_node_map[i].start_pfn; | ||
| 3684 | ei_start <<= PAGE_SHIFT; | ||
| 3685 | addr = find_early_area(ei_start, ei_last, | ||
| 3686 | goal, limit, size, align); | ||
| 3687 | |||
| 3688 | if (addr == -1ULL) | ||
| 3689 | continue; | ||
| 3690 | |||
| 3691 | #if 0 | ||
| 3692 | printk(KERN_DEBUG "alloc (nid=%d %llx - %llx) (%llx - %llx) %llx %llx => %llx\n", | ||
| 3693 | nid, | ||
| 3694 | ei_start, ei_last, goal, limit, size, | ||
| 3695 | align, addr); | ||
| 3696 | #endif | ||
| 3697 | |||
| 3698 | ptr = phys_to_virt(addr); | ||
| 3699 | memset(ptr, 0, size); | ||
| 3700 | reserve_early_without_check(addr, addr + size, "BOOTMEM"); | ||
| 3701 | /* | ||
| 3702 | * The min_count is set to 0 so that bootmem allocated blocks | ||
| 3703 | * are never reported as leaks. | ||
| 3704 | */ | ||
| 3705 | kmemleak_alloc(ptr, size, 0, 0); | ||
| 3706 | return ptr; | ||
| 3707 | } | ||
| 3708 | 3680 | ||
| 3709 | return NULL; | 3681 | ptr = phys_to_virt(addr); |
| 3682 | memset(ptr, 0, size); | ||
| 3683 | memblock_x86_reserve_range(addr, addr + size, "BOOTMEM"); | ||
| 3684 | /* | ||
| 3685 | * The min_count is set to 0 so that bootmem allocated blocks | ||
| 3686 | * are never reported as leaks. | ||
| 3687 | */ | ||
| 3688 | kmemleak_alloc(ptr, size, 0, 0); | ||
| 3689 | return ptr; | ||
| 3710 | } | 3690 | } |
| 3711 | #endif | 3691 | #endif |
| 3712 | 3692 | ||
