aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mm.h2
-rw-r--r--mm/nobootmem.c25
-rw-r--r--mm/page_alloc.c28
3 files changed, 25 insertions, 30 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index f6385fc17ad4..679300c050f5 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1309,8 +1309,6 @@ int add_from_early_node_map(struct range *range, int az,
1309 int nr_range, int nid); 1309 int nr_range, int nid);
1310u64 __init find_memory_core_early(int nid, u64 size, u64 align, 1310u64 __init find_memory_core_early(int nid, u64 size, u64 align,
1311 u64 goal, u64 limit); 1311 u64 goal, u64 limit);
1312void *__alloc_memory_core_early(int nodeid, u64 size, u64 align,
1313 u64 goal, u64 limit);
1314typedef int (*work_fn_t)(unsigned long, unsigned long, void *); 1312typedef int (*work_fn_t)(unsigned long, unsigned long, void *);
1315extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); 1313extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);
1316extern void sparse_memory_present_with_active_regions(int nid); 1314extern void sparse_memory_present_with_active_regions(int nid);
diff --git a/mm/nobootmem.c b/mm/nobootmem.c
index 6a018e49b7be..e2bdb07079ce 100644
--- a/mm/nobootmem.c
+++ b/mm/nobootmem.c
@@ -40,6 +40,31 @@ unsigned long max_pfn;
40unsigned long saved_max_pfn; 40unsigned long saved_max_pfn;
41#endif 41#endif
42 42
43static void * __init __alloc_memory_core_early(int nid, u64 size, u64 align,
44 u64 goal, u64 limit)
45{
46 void *ptr;
47 u64 addr;
48
49 if (limit > memblock.current_limit)
50 limit = memblock.current_limit;
51
52 addr = find_memory_core_early(nid, size, align, goal, limit);
53
54 if (addr == MEMBLOCK_ERROR)
55 return NULL;
56
57 ptr = phys_to_virt(addr);
58 memset(ptr, 0, size);
59 memblock_x86_reserve_range(addr, addr + size, "BOOTMEM");
60 /*
61 * The min_count is set to 0 so that bootmem allocated blocks
62 * are never reported as leaks.
63 */
64 kmemleak_alloc(ptr, size, 0, 0);
65 return ptr;
66}
67
43/* 68/*
44 * free_bootmem_late - free bootmem pages directly to page allocator 69 * free_bootmem_late - free bootmem pages directly to page allocator
45 * @addr: starting address of the range 70 * @addr: starting address of the range
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a243a7fd6922..603513609ba5 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3780,34 +3780,6 @@ int __init add_from_early_node_map(struct range *range, int az,
3780 return nr_range; 3780 return nr_range;
3781} 3781}
3782 3782
3783#ifdef CONFIG_NO_BOOTMEM
3784void * __init __alloc_memory_core_early(int nid, u64 size, u64 align,
3785 u64 goal, u64 limit)
3786{
3787 void *ptr;
3788 u64 addr;
3789
3790 if (limit > memblock.current_limit)
3791 limit = memblock.current_limit;
3792
3793 addr = find_memory_core_early(nid, size, align, goal, limit);
3794
3795 if (addr == MEMBLOCK_ERROR)
3796 return NULL;
3797
3798 ptr = phys_to_virt(addr);
3799 memset(ptr, 0, size);
3800 memblock_x86_reserve_range(addr, addr + size, "BOOTMEM");
3801 /*
3802 * The min_count is set to 0 so that bootmem allocated blocks
3803 * are never reported as leaks.
3804 */
3805 kmemleak_alloc(ptr, size, 0, 0);
3806 return ptr;
3807}
3808#endif
3809
3810
3811void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data) 3783void __init work_with_active_regions(int nid, work_fn_t work_fn, void *data)
3812{ 3784{
3813 int i; 3785 int i;