diff options
-rw-r--r-- | mm/page_alloc.c | 1 | ||||
-rw-r--r-- | mm/sparse-vmemmap.c | 26 | ||||
-rw-r--r-- | mm/sparse.c | 6 |
3 files changed, 22 insertions, 11 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index c37343ef2889..39e847cd1484 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1168,6 +1168,7 @@ static void free_one_page(struct zone *zone, | |||
1168 | static void __meminit __init_single_page(struct page *page, unsigned long pfn, | 1168 | static void __meminit __init_single_page(struct page *page, unsigned long pfn, |
1169 | unsigned long zone, int nid) | 1169 | unsigned long zone, int nid) |
1170 | { | 1170 | { |
1171 | mm_zero_struct_page(page); | ||
1171 | set_page_links(page, zone, nid, pfn); | 1172 | set_page_links(page, zone, nid, pfn); |
1172 | init_page_count(page); | 1173 | init_page_count(page); |
1173 | page_mapcount_reset(page); | 1174 | page_mapcount_reset(page); |
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 478ce6d4a2c4..4e49762599c8 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c | |||
@@ -42,7 +42,7 @@ static void * __ref __earlyonly_bootmem_alloc(int node, | |||
42 | unsigned long align, | 42 | unsigned long align, |
43 | unsigned long goal) | 43 | unsigned long goal) |
44 | { | 44 | { |
45 | return memblock_virt_alloc_try_nid(size, align, goal, | 45 | return memblock_virt_alloc_try_nid_raw(size, align, goal, |
46 | BOOTMEM_ALLOC_ACCESSIBLE, node); | 46 | BOOTMEM_ALLOC_ACCESSIBLE, node); |
47 | } | 47 | } |
48 | 48 | ||
@@ -55,9 +55,8 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node) | |||
55 | if (slab_is_available()) { | 55 | if (slab_is_available()) { |
56 | struct page *page; | 56 | struct page *page; |
57 | 57 | ||
58 | page = alloc_pages_node(node, | 58 | page = alloc_pages_node(node, GFP_KERNEL | __GFP_RETRY_MAYFAIL, |
59 | GFP_KERNEL | __GFP_ZERO | __GFP_RETRY_MAYFAIL, | 59 | get_order(size)); |
60 | get_order(size)); | ||
61 | if (page) | 60 | if (page) |
62 | return page_address(page); | 61 | return page_address(page); |
63 | return NULL; | 62 | return NULL; |
@@ -180,11 +179,22 @@ pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node) | |||
180 | return pte; | 179 | return pte; |
181 | } | 180 | } |
182 | 181 | ||
182 | static void * __meminit vmemmap_alloc_block_zero(unsigned long size, int node) | ||
183 | { | ||
184 | void *p = vmemmap_alloc_block(size, node); | ||
185 | |||
186 | if (!p) | ||
187 | return NULL; | ||
188 | memset(p, 0, size); | ||
189 | |||
190 | return p; | ||
191 | } | ||
192 | |||
183 | pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node) | 193 | pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node) |
184 | { | 194 | { |
185 | pmd_t *pmd = pmd_offset(pud, addr); | 195 | pmd_t *pmd = pmd_offset(pud, addr); |
186 | if (pmd_none(*pmd)) { | 196 | if (pmd_none(*pmd)) { |
187 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); | 197 | void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); |
188 | if (!p) | 198 | if (!p) |
189 | return NULL; | 199 | return NULL; |
190 | pmd_populate_kernel(&init_mm, pmd, p); | 200 | pmd_populate_kernel(&init_mm, pmd, p); |
@@ -196,7 +206,7 @@ pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node) | |||
196 | { | 206 | { |
197 | pud_t *pud = pud_offset(p4d, addr); | 207 | pud_t *pud = pud_offset(p4d, addr); |
198 | if (pud_none(*pud)) { | 208 | if (pud_none(*pud)) { |
199 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); | 209 | void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); |
200 | if (!p) | 210 | if (!p) |
201 | return NULL; | 211 | return NULL; |
202 | pud_populate(&init_mm, pud, p); | 212 | pud_populate(&init_mm, pud, p); |
@@ -208,7 +218,7 @@ p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node) | |||
208 | { | 218 | { |
209 | p4d_t *p4d = p4d_offset(pgd, addr); | 219 | p4d_t *p4d = p4d_offset(pgd, addr); |
210 | if (p4d_none(*p4d)) { | 220 | if (p4d_none(*p4d)) { |
211 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); | 221 | void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); |
212 | if (!p) | 222 | if (!p) |
213 | return NULL; | 223 | return NULL; |
214 | p4d_populate(&init_mm, p4d, p); | 224 | p4d_populate(&init_mm, p4d, p); |
@@ -220,7 +230,7 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node) | |||
220 | { | 230 | { |
221 | pgd_t *pgd = pgd_offset_k(addr); | 231 | pgd_t *pgd = pgd_offset_k(addr); |
222 | if (pgd_none(*pgd)) { | 232 | if (pgd_none(*pgd)) { |
223 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); | 233 | void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); |
224 | if (!p) | 234 | if (!p) |
225 | return NULL; | 235 | return NULL; |
226 | pgd_populate(&init_mm, pgd, p); | 236 | pgd_populate(&init_mm, pgd, p); |
diff --git a/mm/sparse.c b/mm/sparse.c index 60805abf98af..7a5dacaa06e3 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -453,9 +453,9 @@ void __init sparse_mem_maps_populate_node(struct page **map_map, | |||
453 | } | 453 | } |
454 | 454 | ||
455 | size = PAGE_ALIGN(size); | 455 | size = PAGE_ALIGN(size); |
456 | map = memblock_virt_alloc_try_nid(size * map_count, | 456 | map = memblock_virt_alloc_try_nid_raw(size * map_count, |
457 | PAGE_SIZE, __pa(MAX_DMA_ADDRESS), | 457 | PAGE_SIZE, __pa(MAX_DMA_ADDRESS), |
458 | BOOTMEM_ALLOC_ACCESSIBLE, nodeid); | 458 | BOOTMEM_ALLOC_ACCESSIBLE, nodeid); |
459 | if (map) { | 459 | if (map) { |
460 | for (pnum = pnum_begin; pnum < pnum_end; pnum++) { | 460 | for (pnum = pnum_begin; pnum < pnum_end; pnum++) { |
461 | if (!present_section_nr(pnum)) | 461 | if (!present_section_nr(pnum)) |