aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c24
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
6863static int __init cmdline_parse_core(char *p, unsigned long *core, 6863static 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
7034void __init free_area_init(unsigned long *zones_size) 7046void __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
7041static int page_alloc_cpu_dead(unsigned int cpu) 7053static int page_alloc_cpu_dead(unsigned int cpu)