aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/init.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-10-27 13:14:56 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-10-28 08:54:41 -0400
commit7dc50ec7283391dd7a29a80e2a0fb76731a6a7c7 (patch)
treecfce6e8adf5c4a50ed04f390a7acf8f4d7d8b5df /arch/arm/mm/init.c
parentc8c90860cd3592fac83a349f84a20360a6498727 (diff)
ARM: ensure membank array is always sorted
This was missing from the noMMU code, so there was the possibility of things not working as expected if out of order memory information was passed. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm/init.c')
-rw-r--r--arch/arm/mm/init.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 7fd9b5eb177f..759878355a05 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -18,6 +18,7 @@
18#include <linux/highmem.h> 18#include <linux/highmem.h>
19#include <linux/gfp.h> 19#include <linux/gfp.h>
20#include <linux/memblock.h> 20#include <linux/memblock.h>
21#include <linux/sort.h>
21 22
22#include <asm/mach-types.h> 23#include <asm/mach-types.h>
23#include <asm/sections.h> 24#include <asm/sections.h>
@@ -256,10 +257,19 @@ static void arm_memory_present(void)
256} 257}
257#endif 258#endif
258 259
260static int __init meminfo_cmp(const void *_a, const void *_b)
261{
262 const struct membank *a = _a, *b = _b;
263 long cmp = bank_pfn_start(a) - bank_pfn_start(b);
264 return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
265}
266
259void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) 267void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
260{ 268{
261 int i; 269 int i;
262 270
271 sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
272
263 memblock_init(); 273 memblock_init();
264 for (i = 0; i < mi->nr_banks; i++) 274 for (i = 0; i < mi->nr_banks; i++)
265 memblock_add(mi->bank[i].start, mi->bank[i].size); 275 memblock_add(mi->bank[i].start, mi->bank[i].size);