diff options
Diffstat (limited to 'mm/sparse-vmemmap.c')
-rw-r--r-- | mm/sparse-vmemmap.c | 26 |
1 files changed, 18 insertions, 8 deletions
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); |