aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/memblock.h1
-rw-r--r--mm/memblock.c16
-rw-r--r--mm/nobootmem.c10
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,
61phys_addr_t memblock_find_in_range(phys_addr_t start, phys_addr_t end, 61phys_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);
63phys_addr_t get_allocated_memblock_reserved_regions_info(phys_addr_t *addr); 63phys_addr_t get_allocated_memblock_reserved_regions_info(phys_addr_t *addr);
64phys_addr_t get_allocated_memblock_memory_regions_info(phys_addr_t *addr);
64void memblock_allow_resize(void); 65void memblock_allow_resize(void);
65int memblock_add_node(phys_addr_t base, phys_addr_t size, int nid); 66int memblock_add_node(phys_addr_t base, phys_addr_t size, int nid);
66int memblock_add(phys_addr_t base, phys_addr_t size); 67int 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
296phys_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