diff options
author | Michael Bohan <mbohan@codeaurora.org> | 2010-06-14 13:06:56 -0700 |
---|---|---|
committer | Daniel Walker <dwalker@codeaurora.org> | 2010-06-15 13:19:55 -0700 |
commit | 3260e5293727f16ffdce9a6a6203fd9a6b149e58 (patch) | |
tree | 5be7569566f262f3c953e8ac9bbec6f656c03354 /arch/arm | |
parent | 923a081c72fa2dccb7ea7070bd8e0f4dc99ceff8 (diff) |
arm: mm: Don't free prohibited memmap entries
The VM subsystem assumes that there are valid memmap entries to
the bank end aligned to MAX_ORDER_NR_PAGES. It will try and read
these page structs, and so we cannot free any memmap entries that
it may inspect.
Signed-off-by: Michael Bohan <mbohan@codeaurora.org>
Signed-off-by: Daniel Walker <dwalker@codeaurora.org>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mm/init.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index f6a99946532..e18c7cedb48 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -495,28 +495,27 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi) unsigned int i; /* - * [FIXME] This relies on each bank being in address order. This - * may not be the case, especially if the user has provided the - * information on the command line. + * This relies on each bank being in address order. + * The banks are sorted previously in bootmem_init(). */ for_each_nodebank(i, mi, node) { struct membank *bank = &mi->bank[i]; bank_start = bank_pfn_start(bank); - if (bank_start < prev_bank_end) { - printk(KERN_ERR "MEM: unordered memory banks. " - "Not freeing memmap.\n"); - break; - } /* * If we had a previous bank, and there is a space * between the current bank and the previous, free it. */ - if (prev_bank_end && prev_bank_end != bank_start) + if (prev_bank_end && prev_bank_end < bank_start) free_memmap(node, prev_bank_end, bank_start); - prev_bank_end = bank_pfn_end(bank); + /* + * Align up here since the VM subsystem insists that the + * memmap entries are valid from the bank end aligned to + * MAX_ORDER_NR_PAGES. + */ + prev_bank_end = ALIGN(bank_pfn_end(bank), MAX_ORDER_NR_PAGES); } } |