diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 1521100f1e63..3222193c46c6 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -6383,7 +6383,7 @@ void __paginginit free_area_init_node(int nid, unsigned long *zones_size, | |||
6383 | free_area_init_core(pgdat); | 6383 | free_area_init_core(pgdat); |
6384 | } | 6384 | } |
6385 | 6385 | ||
6386 | #ifdef CONFIG_HAVE_MEMBLOCK | 6386 | #if defined(CONFIG_HAVE_MEMBLOCK) && !defined(CONFIG_FLAT_NODE_MEM_MAP) |
6387 | /* | 6387 | /* |
6388 | * Only struct pages that are backed by physical memory are zeroed and | 6388 | * Only struct pages that are backed by physical memory are zeroed and |
6389 | * initialized by going through __init_single_page(). But, there are some | 6389 | * initialized by going through __init_single_page(). But, there are some |
@@ -6421,7 +6421,7 @@ void __paginginit zero_resv_unavail(void) | |||
6421 | if (pgcnt) | 6421 | if (pgcnt) |
6422 | pr_info("Reserved but unavailable: %lld pages", pgcnt); | 6422 | pr_info("Reserved but unavailable: %lld pages", pgcnt); |
6423 | } | 6423 | } |
6424 | #endif /* CONFIG_HAVE_MEMBLOCK */ | 6424 | #endif /* CONFIG_HAVE_MEMBLOCK && !CONFIG_FLAT_NODE_MEM_MAP */ |
6425 | 6425 | ||
6426 | #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP | 6426 | #ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP |
6427 | 6427 | ||
@@ -6847,6 +6847,7 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn) | |||
6847 | /* Initialise every node */ | 6847 | /* Initialise every node */ |
6848 | mminit_verify_pageflags_layout(); | 6848 | mminit_verify_pageflags_layout(); |
6849 | setup_nr_node_ids(); | 6849 | setup_nr_node_ids(); |
6850 | zero_resv_unavail(); | ||
6850 | for_each_online_node(nid) { | 6851 | for_each_online_node(nid) { |
6851 | pg_data_t *pgdat = NODE_DATA(nid); | 6852 | pg_data_t *pgdat = NODE_DATA(nid); |
6852 | free_area_init_node(nid, NULL, | 6853 | free_area_init_node(nid, NULL, |
@@ -6857,7 +6858,6 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn) | |||
6857 | node_set_state(nid, N_MEMORY); | 6858 | node_set_state(nid, N_MEMORY); |
6858 | check_for_memory(pgdat, nid); | 6859 | check_for_memory(pgdat, nid); |
6859 | } | 6860 | } |
6860 | zero_resv_unavail(); | ||
6861 | } | 6861 | } |
6862 | 6862 | ||
6863 | static int __init cmdline_parse_core(char *p, unsigned long *core, | 6863 | static int __init cmdline_parse_core(char *p, unsigned long *core, |
@@ -6939,9 +6939,21 @@ unsigned long free_reserved_area(void *start, void *end, int poison, char *s) | |||
6939 | start = (void *)PAGE_ALIGN((unsigned long)start); | 6939 | start = (void *)PAGE_ALIGN((unsigned long)start); |
6940 | end = (void *)((unsigned long)end & PAGE_MASK); | 6940 | end = (void *)((unsigned long)end & PAGE_MASK); |
6941 | for (pos = start; pos < end; pos += PAGE_SIZE, pages++) { | 6941 | for (pos = start; pos < end; pos += PAGE_SIZE, pages++) { |
6942 | struct page *page = virt_to_page(pos); | ||
6943 | void *direct_map_addr; | ||
6944 | |||
6945 | /* | ||
6946 | * 'direct_map_addr' might be different from 'pos' | ||
6947 | * because some architectures' virt_to_page() | ||
6948 | * work with aliases. Getting the direct map | ||
6949 | * address ensures that we get a _writeable_ | ||
6950 | * alias for the memset(). | ||
6951 | */ | ||
6952 | direct_map_addr = page_address(page); | ||
6942 | if ((unsigned int)poison <= 0xFF) | 6953 | if ((unsigned int)poison <= 0xFF) |
6943 | memset(pos, poison, PAGE_SIZE); | 6954 | memset(direct_map_addr, poison, PAGE_SIZE); |
6944 | free_reserved_page(virt_to_page(pos)); | 6955 | |
6956 | free_reserved_page(page); | ||
6945 | } | 6957 | } |
6946 | 6958 | ||
6947 | if (pages && s) | 6959 | if (pages && s) |
@@ -7033,9 +7045,9 @@ void __init set_dma_reserve(unsigned long new_dma_reserve) | |||
7033 | 7045 | ||
7034 | void __init free_area_init(unsigned long *zones_size) | 7046 | void __init free_area_init(unsigned long *zones_size) |
7035 | { | 7047 | { |
7048 | zero_resv_unavail(); | ||
7036 | free_area_init_node(0, zones_size, | 7049 | free_area_init_node(0, zones_size, |
7037 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL); | 7050 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, NULL); |
7038 | zero_resv_unavail(); | ||
7039 | } | 7051 | } |
7040 | 7052 | ||
7041 | static int page_alloc_cpu_dead(unsigned int cpu) | 7053 | static int page_alloc_cpu_dead(unsigned int cpu) |