diff options
Diffstat (limited to 'arch/riscv/mm/init.c')
| -rw-r--r-- | arch/riscv/mm/init.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index ab475ec6ca42..8d0374d7ce8e 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -442,7 +442,12 @@ static phys_addr_t __meminit alloc_pte_late(uintptr_t va)  {  	struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL & ~__GFP_HIGHMEM, 0); -	BUG_ON(!ptdesc || !pagetable_pte_ctor(ptdesc)); +	/* +	 * We do not know which mm the PTE page is associated to at this point. +	 * Passing NULL to the ctor is the safe option, though it may result +	 * in unnecessary work (e.g. initialising the ptlock for init_mm). +	 */ +	BUG_ON(!ptdesc || !pagetable_pte_ctor(NULL, ptdesc));  	return __pa((pte_t *)ptdesc_address(ptdesc));  } @@ -522,7 +527,8 @@ static phys_addr_t __meminit alloc_pmd_late(uintptr_t va)  {  	struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL & ~__GFP_HIGHMEM, 0); -	BUG_ON(!ptdesc || !pagetable_pmd_ctor(ptdesc)); +	/* See comment in alloc_pte_late() regarding NULL passed the ctor */ +	BUG_ON(!ptdesc || !pagetable_pmd_ctor(NULL, ptdesc));  	return __pa((pmd_t *)ptdesc_address(ptdesc));  } @@ -584,11 +590,11 @@ static phys_addr_t __init alloc_pud_fixmap(uintptr_t va)  static phys_addr_t __meminit alloc_pud_late(uintptr_t va)  { -	unsigned long vaddr; +	struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL, 0); -	vaddr = __get_free_page(GFP_KERNEL); -	BUG_ON(!vaddr); -	return __pa(vaddr); +	BUG_ON(!ptdesc); +	pagetable_pud_ctor(ptdesc); +	return __pa((pud_t *)ptdesc_address(ptdesc));  }  static p4d_t *__init get_p4d_virt_early(phys_addr_t pa) @@ -622,11 +628,11 @@ static phys_addr_t __init alloc_p4d_fixmap(uintptr_t va)  static phys_addr_t __meminit alloc_p4d_late(uintptr_t va)  { -	unsigned long vaddr; +	struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL, 0); -	vaddr = __get_free_page(GFP_KERNEL); -	BUG_ON(!vaddr); -	return __pa(vaddr); +	BUG_ON(!ptdesc); +	pagetable_p4d_ctor(ptdesc); +	return __pa((p4d_t *)ptdesc_address(ptdesc));  }  static void __meminit create_pud_mapping(pud_t *pudp, uintptr_t va, phys_addr_t pa, phys_addr_t sz,  | 
