|
@@ -4756,22 +4756,28 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat,
|
|
|
unsigned long *zones_size,
|
|
|
unsigned long *zholes_size)
|
|
|
{
|
|
|
- unsigned long realtotalpages, totalpages = 0;
|
|
|
+ unsigned long realtotalpages = 0, totalpages = 0;
|
|
|
enum zone_type i;
|
|
|
|
|
|
- for (i = 0; i < MAX_NR_ZONES; i++)
|
|
|
- totalpages += zone_spanned_pages_in_node(pgdat->node_id, i,
|
|
|
- node_start_pfn,
|
|
|
- node_end_pfn,
|
|
|
- zones_size);
|
|
|
- pgdat->node_spanned_pages = totalpages;
|
|
|
-
|
|
|
- realtotalpages = totalpages;
|
|
|
- for (i = 0; i < MAX_NR_ZONES; i++)
|
|
|
- realtotalpages -=
|
|
|
- zone_absent_pages_in_node(pgdat->node_id, i,
|
|
|
+ for (i = 0; i < MAX_NR_ZONES; i++) {
|
|
|
+ struct zone *zone = pgdat->node_zones + i;
|
|
|
+ unsigned long size, real_size;
|
|
|
+
|
|
|
+ size = zone_spanned_pages_in_node(pgdat->node_id, i,
|
|
|
+ node_start_pfn,
|
|
|
+ node_end_pfn,
|
|
|
+ zones_size);
|
|
|
+ real_size = size - zone_absent_pages_in_node(pgdat->node_id, i,
|
|
|
node_start_pfn, node_end_pfn,
|
|
|
zholes_size);
|
|
|
+ zone->spanned_pages = size;
|
|
|
+ zone->present_pages = real_size;
|
|
|
+
|
|
|
+ totalpages += size;
|
|
|
+ realtotalpages += real_size;
|
|
|
+ }
|
|
|
+
|
|
|
+ pgdat->node_spanned_pages = totalpages;
|
|
|
pgdat->node_present_pages = realtotalpages;
|
|
|
printk(KERN_DEBUG "On node %d totalpages: %lu\n", pgdat->node_id,
|
|
|
realtotalpages);
|
|
@@ -4881,8 +4887,7 @@ static unsigned long __paginginit calc_memmap_size(unsigned long spanned_pages,
|
|
|
* NOTE: pgdat should get zeroed by caller.
|
|
|
*/
|
|
|
static void __paginginit free_area_init_core(struct pglist_data *pgdat,
|
|
|
- unsigned long node_start_pfn, unsigned long node_end_pfn,
|
|
|
- unsigned long *zones_size, unsigned long *zholes_size)
|
|
|
+ unsigned long node_start_pfn, unsigned long node_end_pfn)
|
|
|
{
|
|
|
enum zone_type j;
|
|
|
int nid = pgdat->node_id;
|
|
@@ -4903,12 +4908,8 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
|
|
|
struct zone *zone = pgdat->node_zones + j;
|
|
|
unsigned long size, realsize, freesize, memmap_pages;
|
|
|
|
|
|
- size = zone_spanned_pages_in_node(nid, j, node_start_pfn,
|
|
|
- node_end_pfn, zones_size);
|
|
|
- realsize = freesize = size - zone_absent_pages_in_node(nid, j,
|
|
|
- node_start_pfn,
|
|
|
- node_end_pfn,
|
|
|
- zholes_size);
|
|
|
+ size = zone->spanned_pages;
|
|
|
+ realsize = freesize = zone->present_pages;
|
|
|
|
|
|
/*
|
|
|
* Adjust freesize so that it accounts for how much memory
|
|
@@ -4943,8 +4944,6 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
|
|
|
nr_kernel_pages -= memmap_pages;
|
|
|
nr_all_pages += freesize;
|
|
|
|
|
|
- zone->spanned_pages = size;
|
|
|
- zone->present_pages = realsize;
|
|
|
/*
|
|
|
* Set an approximate value for lowmem here, it will be adjusted
|
|
|
* when the bootmem allocator frees pages into the buddy system.
|
|
@@ -5050,8 +5049,7 @@ void __paginginit free_area_init_node(int nid, unsigned long *zones_size,
|
|
|
(unsigned long)pgdat->node_mem_map);
|
|
|
#endif
|
|
|
|
|
|
- free_area_init_core(pgdat, start_pfn, end_pfn,
|
|
|
- zones_size, zholes_size);
|
|
|
+ free_area_init_core(pgdat, start_pfn, end_pfn);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
|