|
@@ -22,8 +22,7 @@
|
|
|
* 1) mem_section - memory sections, mem_map's for valid memory
|
|
|
*/
|
|
|
#ifdef CONFIG_SPARSEMEM_EXTREME
|
|
|
-struct mem_section *mem_section[NR_SECTION_ROOTS]
|
|
|
- ____cacheline_internodealigned_in_smp;
|
|
|
+struct mem_section **mem_section;
|
|
|
#else
|
|
|
struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT]
|
|
|
____cacheline_internodealigned_in_smp;
|
|
@@ -100,7 +99,7 @@ static inline int sparse_index_init(unsigned long section_nr, int nid)
|
|
|
int __section_nr(struct mem_section* ms)
|
|
|
{
|
|
|
unsigned long root_nr;
|
|
|
- struct mem_section* root;
|
|
|
+ struct mem_section *root = NULL;
|
|
|
|
|
|
for (root_nr = 0; root_nr < NR_SECTION_ROOTS; root_nr++) {
|
|
|
root = __nr_to_section(root_nr * SECTIONS_PER_ROOT);
|
|
@@ -111,7 +110,7 @@ int __section_nr(struct mem_section* ms)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- VM_BUG_ON(root_nr == NR_SECTION_ROOTS);
|
|
|
+ VM_BUG_ON(!root);
|
|
|
|
|
|
return (root_nr * SECTIONS_PER_ROOT) + (ms - root);
|
|
|
}
|
|
@@ -329,11 +328,17 @@ again:
|
|
|
static void __init check_usemap_section_nr(int nid, unsigned long *usemap)
|
|
|
{
|
|
|
unsigned long usemap_snr, pgdat_snr;
|
|
|
- static unsigned long old_usemap_snr = NR_MEM_SECTIONS;
|
|
|
- static unsigned long old_pgdat_snr = NR_MEM_SECTIONS;
|
|
|
+ static unsigned long old_usemap_snr;
|
|
|
+ static unsigned long old_pgdat_snr;
|
|
|
struct pglist_data *pgdat = NODE_DATA(nid);
|
|
|
int usemap_nid;
|
|
|
|
|
|
+ /* First call */
|
|
|
+ if (!old_usemap_snr) {
|
|
|
+ old_usemap_snr = NR_MEM_SECTIONS;
|
|
|
+ old_pgdat_snr = NR_MEM_SECTIONS;
|
|
|
+ }
|
|
|
+
|
|
|
usemap_snr = pfn_to_section_nr(__pa(usemap) >> PAGE_SHIFT);
|
|
|
pgdat_snr = pfn_to_section_nr(__pa(pgdat) >> PAGE_SHIFT);
|
|
|
if (usemap_snr == pgdat_snr)
|