asm-generic: Prepare for riscv use of pud_alloc_one and pud_free
In the following commits, riscv will almost use the generic versions of pud_alloc_one and pud_free but an additional check is required since those functions are only relevant when using at least a 4-level page table, which will be determined at runtime on riscv. So move the content of those functions into other functions that riscv can use without duplicating code. Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
3270bfdb9e
commit
60639f74c2
@ -147,6 +147,15 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS > 3
|
#if CONFIG_PGTABLE_LEVELS > 3
|
||||||
|
|
||||||
|
static inline pud_t *__pud_alloc_one(struct mm_struct *mm, unsigned long addr)
|
||||||
|
{
|
||||||
|
gfp_t gfp = GFP_PGTABLE_USER;
|
||||||
|
|
||||||
|
if (mm == &init_mm)
|
||||||
|
gfp = GFP_PGTABLE_KERNEL;
|
||||||
|
return (pud_t *)get_zeroed_page(gfp);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_PUD_ALLOC_ONE
|
#ifndef __HAVE_ARCH_PUD_ALLOC_ONE
|
||||||
/**
|
/**
|
||||||
* pud_alloc_one - allocate a page for PUD-level page table
|
* pud_alloc_one - allocate a page for PUD-level page table
|
||||||
@ -159,20 +168,23 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|||||||
*/
|
*/
|
||||||
static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
|
static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
|
||||||
{
|
{
|
||||||
gfp_t gfp = GFP_PGTABLE_USER;
|
return __pud_alloc_one(mm, addr);
|
||||||
|
|
||||||
if (mm == &init_mm)
|
|
||||||
gfp = GFP_PGTABLE_KERNEL;
|
|
||||||
return (pud_t *)get_zeroed_page(gfp);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
static inline void __pud_free(struct mm_struct *mm, pud_t *pud)
|
||||||
{
|
{
|
||||||
BUG_ON((unsigned long)pud & (PAGE_SIZE-1));
|
BUG_ON((unsigned long)pud & (PAGE_SIZE-1));
|
||||||
free_page((unsigned long)pud);
|
free_page((unsigned long)pud);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __HAVE_ARCH_PUD_FREE
|
||||||
|
static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
||||||
|
{
|
||||||
|
__pud_free(mm, pud);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_PGTABLE_LEVELS > 3 */
|
#endif /* CONFIG_PGTABLE_LEVELS > 3 */
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_PGD_FREE
|
#ifndef __HAVE_ARCH_PGD_FREE
|
||||||
|
Loading…
Reference in New Issue
Block a user