Commit 657e12fd authored by Russell King's avatar Russell King

ARM: Fix sparsemem with SPARSEMEM_EXTREME enabled

When SPARSEMEM_EXTREME is enabled, memory_present() wants to use bootmem
to allocate data structures.  However, we call memory_present() after
declaring memory to bootmem, but before we've reserved areas.

This leads to sparsemem data structures being overwritten later in the
kernel's initialization (when slab initializes.)
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent c06e004c
...@@ -273,7 +273,6 @@ static void __init bootmem_init_node(int node, struct meminfo *mi, ...@@ -273,7 +273,6 @@ static void __init bootmem_init_node(int node, struct meminfo *mi,
struct membank *bank = &mi->bank[i]; struct membank *bank = &mi->bank[i];
if (!bank->highmem) if (!bank->highmem)
free_bootmem_node(pgdat, bank_phys_start(bank), bank_phys_size(bank)); free_bootmem_node(pgdat, bank_phys_start(bank), bank_phys_size(bank));
memory_present(node, bank_pfn_start(bank), bank_pfn_end(bank));
} }
/* /*
...@@ -370,6 +369,19 @@ int pfn_valid(unsigned long pfn) ...@@ -370,6 +369,19 @@ int pfn_valid(unsigned long pfn)
return 0; return 0;
} }
EXPORT_SYMBOL(pfn_valid); EXPORT_SYMBOL(pfn_valid);
static void arm_memory_present(struct meminfo *mi, int node)
{
}
#else
static void arm_memory_present(struct meminfo *mi, int node)
{
int i;
for_each_nodebank(i, mi, node) {
struct membank *bank = &mi->bank[i];
memory_present(node, bank_pfn_start(bank), bank_pfn_end(bank));
}
}
#endif #endif
static int __init meminfo_cmp(const void *_a, const void *_b) static int __init meminfo_cmp(const void *_a, const void *_b)
...@@ -427,6 +439,12 @@ void __init bootmem_init(void) ...@@ -427,6 +439,12 @@ void __init bootmem_init(void)
*/ */
if (node == initrd_node) if (node == initrd_node)
bootmem_reserve_initrd(node); bootmem_reserve_initrd(node);
/*
* Sparsemem tries to allocate bootmem in memory_present(),
* so must be done after the fixed reservations
*/
arm_memory_present(mi, node);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment