ARM: memblock: convert free_highpages() to use memblock
Free the high pages using the memblock memory lists - and more importantly, exclude any memblock allocations in highmem from the free'd memory. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
d0e775afb9
commit
df4f14c7b2
1 changed files with 39 additions and 5 deletions
|
@ -439,13 +439,47 @@ static void __init free_unused_memmap(struct meminfo *mi)
|
||||||
static void __init free_highpages(void)
|
static void __init free_highpages(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
int i;
|
unsigned long max_low = max_low_pfn + PHYS_PFN_OFFSET;
|
||||||
|
struct memblock_region *mem, *res;
|
||||||
|
|
||||||
/* set highmem page free */
|
/* set highmem page free */
|
||||||
for_each_bank (i, &meminfo) {
|
for_each_memblock(memory, mem) {
|
||||||
unsigned long start = bank_pfn_start(&meminfo.bank[i]);
|
unsigned long start = memblock_region_memory_base_pfn(mem);
|
||||||
unsigned long end = bank_pfn_end(&meminfo.bank[i]);
|
unsigned long end = memblock_region_memory_end_pfn(mem);
|
||||||
if (start >= max_low_pfn + PHYS_PFN_OFFSET)
|
|
||||||
|
/* Ignore complete lowmem entries */
|
||||||
|
if (end <= max_low)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Truncate partial highmem entries */
|
||||||
|
if (start < max_low)
|
||||||
|
start = max_low;
|
||||||
|
|
||||||
|
/* Find and exclude any reserved regions */
|
||||||
|
for_each_memblock(reserved, res) {
|
||||||
|
unsigned long res_start, res_end;
|
||||||
|
|
||||||
|
res_start = memblock_region_reserved_base_pfn(res);
|
||||||
|
res_end = memblock_region_reserved_end_pfn(res);
|
||||||
|
|
||||||
|
if (res_end < start)
|
||||||
|
continue;
|
||||||
|
if (res_start < start)
|
||||||
|
res_start = start;
|
||||||
|
if (res_start > end)
|
||||||
|
res_start = end;
|
||||||
|
if (res_end > end)
|
||||||
|
res_end = end;
|
||||||
|
if (res_start != start)
|
||||||
|
totalhigh_pages += free_area(start, res_start,
|
||||||
|
NULL);
|
||||||
|
start = res_end;
|
||||||
|
if (start == end)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And now free anything which remains */
|
||||||
|
if (start < end)
|
||||||
totalhigh_pages += free_area(start, end, NULL);
|
totalhigh_pages += free_area(start, end, NULL);
|
||||||
}
|
}
|
||||||
totalram_pages += totalhigh_pages;
|
totalram_pages += totalhigh_pages;
|
||||||
|
|
Loading…
Reference in a new issue