diff options
-rw-r--r-- | include/linux/memblock.h | 1 | ||||
-rw-r--r-- | mm/memblock.c | 16 | ||||
-rw-r--r-- | mm/nobootmem.c | 10 |
3 files changed, 26 insertions, 1 deletions
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index cd0274bebd4c..1ef66360f0b0 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h | |||
@@ -61,6 +61,7 @@ phys_addr_t memblock_find_in_range_node(phys_addr_t size, phys_addr_t align, | |||
61 | phys_addr_t memblock_find_in_range(phys_addr_t start, phys_addr_t end, | 61 | phys_addr_t memblock_find_in_range(phys_addr_t start, phys_addr_t end, |
62 | phys_addr_t size, phys_addr_t align); | 62 | phys_addr_t size, phys_addr_t align); |
63 | phys_addr_t get_allocated_memblock_reserved_regions_info(phys_addr_t *addr); | 63 | phys_addr_t get_allocated_memblock_reserved_regions_info(phys_addr_t *addr); |
64 | phys_addr_t get_allocated_memblock_memory_regions_info(phys_addr_t *addr); | ||
64 | void memblock_allow_resize(void); | 65 | void memblock_allow_resize(void); |
65 | int memblock_add_node(phys_addr_t base, phys_addr_t size, int nid); | 66 | int memblock_add_node(phys_addr_t base, phys_addr_t size, int nid); |
66 | int memblock_add(phys_addr_t base, phys_addr_t size); | 67 | int memblock_add(phys_addr_t base, phys_addr_t size); |
diff --git a/mm/memblock.c b/mm/memblock.c index 1c2ef2c7edab..64ed2439cf75 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
@@ -291,6 +291,22 @@ phys_addr_t __init_memblock get_allocated_memblock_reserved_regions_info( | |||
291 | memblock.reserved.max); | 291 | memblock.reserved.max); |
292 | } | 292 | } |
293 | 293 | ||
294 | #ifdef CONFIG_ARCH_DISCARD_MEMBLOCK | ||
295 | |||
296 | phys_addr_t __init_memblock get_allocated_memblock_memory_regions_info( | ||
297 | phys_addr_t *addr) | ||
298 | { | ||
299 | if (memblock.memory.regions == memblock_memory_init_regions) | ||
300 | return 0; | ||
301 | |||
302 | *addr = __pa(memblock.memory.regions); | ||
303 | |||
304 | return PAGE_ALIGN(sizeof(struct memblock_region) * | ||
305 | memblock.memory.max); | ||
306 | } | ||
307 | |||
308 | #endif | ||
309 | |||
294 | /** | 310 | /** |
295 | * memblock_double_array - double the size of the memblock regions array | 311 | * memblock_double_array - double the size of the memblock regions array |
296 | * @type: memblock type of the regions array being doubled | 312 | * @type: memblock type of the regions array being doubled |
diff --git a/mm/nobootmem.c b/mm/nobootmem.c index bb1a70cc97a7..17c89023184f 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c | |||
@@ -122,11 +122,19 @@ static unsigned long __init free_low_memory_core_early(void) | |||
122 | for_each_free_mem_range(i, NUMA_NO_NODE, &start, &end, NULL) | 122 | for_each_free_mem_range(i, NUMA_NO_NODE, &start, &end, NULL) |
123 | count += __free_memory_core(start, end); | 123 | count += __free_memory_core(start, end); |
124 | 124 | ||
125 | /* free range that is used for reserved array if we allocate it */ | 125 | /* Free memblock.reserved array if it was allocated */ |
126 | size = get_allocated_memblock_reserved_regions_info(&start); | 126 | size = get_allocated_memblock_reserved_regions_info(&start); |
127 | if (size) | 127 | if (size) |
128 | count += __free_memory_core(start, start + size); | 128 | count += __free_memory_core(start, start + size); |
129 | 129 | ||
130 | #ifdef CONFIG_ARCH_DISCARD_MEMBLOCK | ||
131 | |||
132 | /* Free memblock.memory array if it was allocated */ | ||
133 | size = get_allocated_memblock_memory_regions_info(&start); | ||
134 | if (size) | ||
135 | count += __free_memory_core(start, start + size); | ||
136 | #endif | ||
137 | |||
130 | return count; | 138 | return count; |
131 | } | 139 | } |
132 | 140 | ||