Skip to content

Commit 4a6d8cf

Browse files
chleroympe
authored andcommitted
powerpc/mm: don't use pte_alloc_kernel() until slab is available on PPC32
In the same way as PPC64, implement early allocation functions and avoid calling pte_alloc_kernel() before slab is available. Reviewed-by: Aneesh Kumar K.V <[email protected]> Signed-off-by: Christophe Leroy <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent 627f06c commit 4a6d8cf

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

arch/powerpc/mm/pgtable_32.c

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@ EXPORT_SYMBOL(ioremap_bot); /* aka VMALLOC_END */
4343

4444
extern char etext[], _stext[], _sinittext[], _einittext[];
4545

46-
__ref pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
46+
pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
4747
{
48-
if (!slab_is_available())
49-
return memblock_alloc(PTE_FRAG_SIZE, PTE_FRAG_SIZE);
50-
5148
return (pte_t *)pte_fragment_alloc(mm, 1);
5249
}
5350

@@ -205,7 +202,29 @@ void iounmap(volatile void __iomem *addr)
205202
}
206203
EXPORT_SYMBOL(iounmap);
207204

208-
int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot)
205+
static void __init *early_alloc_pgtable(unsigned long size)
206+
{
207+
void *ptr = memblock_alloc(size, size);
208+
209+
if (!ptr)
210+
panic("%s: Failed to allocate %lu bytes align=0x%lx\n",
211+
__func__, size, size);
212+
213+
return ptr;
214+
}
215+
216+
static pte_t __init *early_pte_alloc_kernel(pmd_t *pmdp, unsigned long va)
217+
{
218+
if (pmd_none(*pmdp)) {
219+
pte_t *ptep = early_alloc_pgtable(PTE_FRAG_SIZE);
220+
221+
pmd_populate_kernel(&init_mm, pmdp, ptep);
222+
}
223+
return pte_offset_kernel(pmdp, va);
224+
}
225+
226+
227+
int __ref map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot)
209228
{
210229
pmd_t *pd;
211230
pte_t *pg;
@@ -214,7 +233,10 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot)
214233
/* Use upper 10 bits of VA to index the first level map */
215234
pd = pmd_offset(pud_offset(pgd_offset_k(va), va), va);
216235
/* Use middle 10 bits of VA to index the second-level map */
217-
pg = pte_alloc_kernel(pd, va);
236+
if (likely(slab_is_available()))
237+
pg = pte_alloc_kernel(pd, va);
238+
else
239+
pg = early_pte_alloc_kernel(pd, va);
218240
if (pg != 0) {
219241
err = 0;
220242
/* The PTE should never be already set nor present in the

0 commit comments

Comments
 (0)