diff options
Diffstat (limited to 'mm/sparse-vmemmap.c')
-rw-r--r-- | mm/sparse-vmemmap.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 574c67b663fe..a56c3989f773 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c | |||
@@ -196,9 +196,9 @@ pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node) | |||
196 | return pmd; | 196 | return pmd; |
197 | } | 197 | } |
198 | 198 | ||
199 | pud_t * __meminit vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node) | 199 | pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node) |
200 | { | 200 | { |
201 | pud_t *pud = pud_offset(pgd, addr); | 201 | pud_t *pud = pud_offset(p4d, addr); |
202 | if (pud_none(*pud)) { | 202 | if (pud_none(*pud)) { |
203 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); | 203 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); |
204 | if (!p) | 204 | if (!p) |
@@ -208,6 +208,18 @@ pud_t * __meminit vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node) | |||
208 | return pud; | 208 | return pud; |
209 | } | 209 | } |
210 | 210 | ||
211 | p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node) | ||
212 | { | ||
213 | p4d_t *p4d = p4d_offset(pgd, addr); | ||
214 | if (p4d_none(*p4d)) { | ||
215 | void *p = vmemmap_alloc_block(PAGE_SIZE, node); | ||
216 | if (!p) | ||
217 | return NULL; | ||
218 | p4d_populate(&init_mm, p4d, p); | ||
219 | } | ||
220 | return p4d; | ||
221 | } | ||
222 | |||
211 | pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node) | 223 | pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node) |
212 | { | 224 | { |
213 | pgd_t *pgd = pgd_offset_k(addr); | 225 | pgd_t *pgd = pgd_offset_k(addr); |
@@ -225,6 +237,7 @@ int __meminit vmemmap_populate_basepages(unsigned long start, | |||
225 | { | 237 | { |
226 | unsigned long addr = start; | 238 | unsigned long addr = start; |
227 | pgd_t *pgd; | 239 | pgd_t *pgd; |
240 | p4d_t *p4d; | ||
228 | pud_t *pud; | 241 | pud_t *pud; |
229 | pmd_t *pmd; | 242 | pmd_t *pmd; |
230 | pte_t *pte; | 243 | pte_t *pte; |
@@ -233,7 +246,10 @@ int __meminit vmemmap_populate_basepages(unsigned long start, | |||
233 | pgd = vmemmap_pgd_populate(addr, node); | 246 | pgd = vmemmap_pgd_populate(addr, node); |
234 | if (!pgd) | 247 | if (!pgd) |
235 | return -ENOMEM; | 248 | return -ENOMEM; |
236 | pud = vmemmap_pud_populate(pgd, addr, node); | 249 | p4d = vmemmap_p4d_populate(pgd, addr, node); |
250 | if (!p4d) | ||
251 | return -ENOMEM; | ||
252 | pud = vmemmap_pud_populate(p4d, addr, node); | ||
237 | if (!pud) | 253 | if (!pud) |
238 | return -ENOMEM; | 254 | return -ENOMEM; |
239 | pmd = vmemmap_pmd_populate(pud, addr, node); | 255 | pmd = vmemmap_pmd_populate(pud, addr, node); |