diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memblock.c | 12 | ||||
-rw-r--r-- | mm/nobootmem.c | 7 |
2 files changed, 18 insertions, 1 deletions
diff --git a/mm/memblock.c b/mm/memblock.c index 1c2ef2c7edab..41cb96a5c77d 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -291,6 +291,18 @@ phys_addr_t __init_memblock get_allocated_memblock_reserved_regions_info( memblock.reserved.max); } +phys_addr_t __init_memblock get_allocated_memblock_memory_regions_info( + phys_addr_t *addr) +{ + if (memblock.memory.regions == memblock_memory_init_regions) + return 0; + + *addr = __pa(memblock.memory.regions); + + return PAGE_ALIGN(sizeof(struct memblock_region) * + memblock.memory.max); +} + /** * memblock_double_array - double the size of the memblock regions array * @type: memblock type of the regions array being doubled diff --git a/mm/nobootmem.c b/mm/nobootmem.c index bb1a70cc97a7..a6f357b801f2 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c @@ -122,11 +122,16 @@ static unsigned long __init free_low_memory_core_early(void) for_each_free_mem_range(i, NUMA_NO_NODE, &start, &end, NULL) count += __free_memory_core(start, end); - /* free range that is used for reserved array if we allocate it */ + /* Free memblock.reserved array if it was allocated */ size = get_allocated_memblock_reserved_regions_info(&start); if (size) count += __free_memory_core(start, start + size); + /* Free memblock.memory array if it was allocated */ + size = get_allocated_memblock_memory_regions_info(&start); + if (size) + count += __free_memory_core(start, start + size); + return count; } |