diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 56 |
1 files changed, 48 insertions, 8 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 338a02bb004d..dc523a1f270d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -49,7 +49,6 @@ nodemask_t node_online_map __read_mostly = { { [0] = 1UL } }; | |||
49 | EXPORT_SYMBOL(node_online_map); | 49 | EXPORT_SYMBOL(node_online_map); |
50 | nodemask_t node_possible_map __read_mostly = NODE_MASK_ALL; | 50 | nodemask_t node_possible_map __read_mostly = NODE_MASK_ALL; |
51 | EXPORT_SYMBOL(node_possible_map); | 51 | EXPORT_SYMBOL(node_possible_map); |
52 | struct pglist_data *pgdat_list __read_mostly; | ||
53 | unsigned long totalram_pages __read_mostly; | 52 | unsigned long totalram_pages __read_mostly; |
54 | unsigned long totalhigh_pages __read_mostly; | 53 | unsigned long totalhigh_pages __read_mostly; |
55 | long nr_swap_pages; | 54 | long nr_swap_pages; |
@@ -1201,7 +1200,7 @@ unsigned int nr_free_highpages (void) | |||
1201 | pg_data_t *pgdat; | 1200 | pg_data_t *pgdat; |
1202 | unsigned int pages = 0; | 1201 | unsigned int pages = 0; |
1203 | 1202 | ||
1204 | for_each_pgdat(pgdat) | 1203 | for_each_online_pgdat(pgdat) |
1205 | pages += pgdat->node_zones[ZONE_HIGHMEM].free_pages; | 1204 | pages += pgdat->node_zones[ZONE_HIGHMEM].free_pages; |
1206 | 1205 | ||
1207 | return pages; | 1206 | return pages; |
@@ -1343,7 +1342,7 @@ void get_zone_counts(unsigned long *active, | |||
1343 | *active = 0; | 1342 | *active = 0; |
1344 | *inactive = 0; | 1343 | *inactive = 0; |
1345 | *free = 0; | 1344 | *free = 0; |
1346 | for_each_pgdat(pgdat) { | 1345 | for_each_online_pgdat(pgdat) { |
1347 | unsigned long l, m, n; | 1346 | unsigned long l, m, n; |
1348 | __get_zone_counts(&l, &m, &n, pgdat); | 1347 | __get_zone_counts(&l, &m, &n, pgdat); |
1349 | *active += l; | 1348 | *active += l; |
@@ -2042,7 +2041,6 @@ static __meminit void init_currently_empty_zone(struct zone *zone, | |||
2042 | zone_wait_table_init(zone, size); | 2041 | zone_wait_table_init(zone, size); |
2043 | pgdat->nr_zones = zone_idx(zone) + 1; | 2042 | pgdat->nr_zones = zone_idx(zone) + 1; |
2044 | 2043 | ||
2045 | zone->zone_mem_map = pfn_to_page(zone_start_pfn); | ||
2046 | zone->zone_start_pfn = zone_start_pfn; | 2044 | zone->zone_start_pfn = zone_start_pfn; |
2047 | 2045 | ||
2048 | memmap_init(size, pgdat->node_id, zone_idx(zone), zone_start_pfn); | 2046 | memmap_init(size, pgdat->node_id, zone_idx(zone), zone_start_pfn); |
@@ -2170,8 +2168,9 @@ static void *frag_start(struct seq_file *m, loff_t *pos) | |||
2170 | { | 2168 | { |
2171 | pg_data_t *pgdat; | 2169 | pg_data_t *pgdat; |
2172 | loff_t node = *pos; | 2170 | loff_t node = *pos; |
2173 | 2171 | for (pgdat = first_online_pgdat(); | |
2174 | for (pgdat = pgdat_list; pgdat && node; pgdat = pgdat->pgdat_next) | 2172 | pgdat && node; |
2173 | pgdat = next_online_pgdat(pgdat)) | ||
2175 | --node; | 2174 | --node; |
2176 | 2175 | ||
2177 | return pgdat; | 2176 | return pgdat; |
@@ -2182,7 +2181,7 @@ static void *frag_next(struct seq_file *m, void *arg, loff_t *pos) | |||
2182 | pg_data_t *pgdat = (pg_data_t *)arg; | 2181 | pg_data_t *pgdat = (pg_data_t *)arg; |
2183 | 2182 | ||
2184 | (*pos)++; | 2183 | (*pos)++; |
2185 | return pgdat->pgdat_next; | 2184 | return next_online_pgdat(pgdat); |
2186 | } | 2185 | } |
2187 | 2186 | ||
2188 | static void frag_stop(struct seq_file *m, void *arg) | 2187 | static void frag_stop(struct seq_file *m, void *arg) |
@@ -2483,7 +2482,7 @@ static void setup_per_zone_lowmem_reserve(void) | |||
2483 | struct pglist_data *pgdat; | 2482 | struct pglist_data *pgdat; |
2484 | int j, idx; | 2483 | int j, idx; |
2485 | 2484 | ||
2486 | for_each_pgdat(pgdat) { | 2485 | for_each_online_pgdat(pgdat) { |
2487 | for (j = 0; j < MAX_NR_ZONES; j++) { | 2486 | for (j = 0; j < MAX_NR_ZONES; j++) { |
2488 | struct zone *zone = pgdat->node_zones + j; | 2487 | struct zone *zone = pgdat->node_zones + j; |
2489 | unsigned long present_pages = zone->present_pages; | 2488 | unsigned long present_pages = zone->present_pages; |
@@ -2745,3 +2744,44 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
2745 | 2744 | ||
2746 | return table; | 2745 | return table; |
2747 | } | 2746 | } |
2747 | |||
2748 | #ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE | ||
2749 | /* | ||
2750 | * pfn <-> page translation. out-of-line version. | ||
2751 | * (see asm-generic/memory_model.h) | ||
2752 | */ | ||
2753 | #if defined(CONFIG_FLATMEM) | ||
2754 | struct page *pfn_to_page(unsigned long pfn) | ||
2755 | { | ||
2756 | return mem_map + (pfn - ARCH_PFN_OFFSET); | ||
2757 | } | ||
2758 | unsigned long page_to_pfn(struct page *page) | ||
2759 | { | ||
2760 | return (page - mem_map) + ARCH_PFN_OFFSET; | ||
2761 | } | ||
2762 | #elif defined(CONFIG_DISCONTIGMEM) | ||
2763 | struct page *pfn_to_page(unsigned long pfn) | ||
2764 | { | ||
2765 | int nid = arch_pfn_to_nid(pfn); | ||
2766 | return NODE_DATA(nid)->node_mem_map + arch_local_page_offset(pfn,nid); | ||
2767 | } | ||
2768 | unsigned long page_to_pfn(struct page *page) | ||
2769 | { | ||
2770 | struct pglist_data *pgdat = NODE_DATA(page_to_nid(page)); | ||
2771 | return (page - pgdat->node_mem_map) + pgdat->node_start_pfn; | ||
2772 | } | ||
2773 | #elif defined(CONFIG_SPARSEMEM) | ||
2774 | struct page *pfn_to_page(unsigned long pfn) | ||
2775 | { | ||
2776 | return __section_mem_map_addr(__pfn_to_section(pfn)) + pfn; | ||
2777 | } | ||
2778 | |||
2779 | unsigned long page_to_pfn(struct page *page) | ||
2780 | { | ||
2781 | long section_id = page_to_section(page); | ||
2782 | return page - __section_mem_map_addr(__nr_to_section(section_id)); | ||
2783 | } | ||
2784 | #endif /* CONFIG_FLATMEM/DISCONTIGMME/SPARSEMEM */ | ||
2785 | EXPORT_SYMBOL(pfn_to_page); | ||
2786 | EXPORT_SYMBOL(page_to_pfn); | ||
2787 | #endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */ | ||