aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/bootmem.c3
-rw-r--r--mm/page_alloc.c50
-rw-r--r--mm/sparse-vmemmap.c11
3 files changed, 18 insertions, 46 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c
index bde170dd2fde..fda01a2c31af 100644
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -15,6 +15,7 @@
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/kmemleak.h> 16#include <linux/kmemleak.h>
17#include <linux/range.h> 17#include <linux/range.h>
18#include <linux/memblock.h>
18 19
19#include <asm/bug.h> 20#include <asm/bug.h>
20#include <asm/io.h> 21#include <asm/io.h>
@@ -434,6 +435,7 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
434 unsigned long size) 435 unsigned long size)
435{ 436{
436#ifdef CONFIG_NO_BOOTMEM 437#ifdef CONFIG_NO_BOOTMEM
438 kmemleak_free_part(__va(physaddr), size);
437 free_early(physaddr, physaddr + size); 439 free_early(physaddr, physaddr + size);
438#else 440#else
439 unsigned long start, end; 441 unsigned long start, end;
@@ -459,6 +461,7 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
459void __init free_bootmem(unsigned long addr, unsigned long size) 461void __init free_bootmem(unsigned long addr, unsigned long size)
460{ 462{
461#ifdef CONFIG_NO_BOOTMEM 463#ifdef CONFIG_NO_BOOTMEM
464 kmemleak_free_part(__va(addr), size);
462 free_early(addr, addr + size); 465 free_early(addr, addr + size);
463#else 466#else
464 unsigned long start, end; 467 unsigned long start, end;
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,
3667void * __init __alloc_memory_core_early(int nid, u64 size, u64 align, 3667void * __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
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index aa33fd67fa41..29d6cbffb283 100644
--- a/mm/sparse-vmemmap.c
+++ b/mm/sparse-vmemmap.c
@@ -220,18 +220,7 @@ void __init sparse_mem_maps_populate_node(struct page **map_map,
220 220
221 if (vmemmap_buf_start) { 221 if (vmemmap_buf_start) {
222 /* need to free left buf */ 222 /* need to free left buf */
223#ifdef CONFIG_NO_BOOTMEM
224 free_early(__pa(vmemmap_buf_start), __pa(vmemmap_buf_end));
225 if (vmemmap_buf_start < vmemmap_buf) {
226 char name[15];
227
228 snprintf(name, sizeof(name), "MEMMAP %d", nodeid);
229 reserve_early_without_check(__pa(vmemmap_buf_start),
230 __pa(vmemmap_buf), name);
231 }
232#else
233 free_bootmem(__pa(vmemmap_buf), vmemmap_buf_end - vmemmap_buf); 223 free_bootmem(__pa(vmemmap_buf), vmemmap_buf_end - vmemmap_buf);
234#endif
235 vmemmap_buf = NULL; 224 vmemmap_buf = NULL;
236 vmemmap_buf_end = NULL; 225 vmemmap_buf_end = NULL;
237 } 226 }