Files

104 lines
2.3 KiB
C
Raw Permalink Normal View History

2005-04-16 15:20:36 -07:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1994 - 2001, 2003 by Ralf Baechle
* Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
*/
#ifndef _ASM_PGALLOC_H
#define _ASM_PGALLOC_H
#include <linux/highmem.h>
#include <linux/mm.h>
2007-05-21 01:22:52 +04:00
#include <linux/sched.h>
2005-04-16 15:20:36 -07:00
#define __HAVE_ARCH_PMD_ALLOC_ONE
#define __HAVE_ARCH_PUD_ALLOC_ONE
#include <asm-generic/pgalloc.h>
2005-04-16 15:20:36 -07:00
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
pte_t *pte)
{
set_pmd(pmd, __pmd((unsigned long)pte));
}
static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
2008-02-08 04:22:04 -08:00
pgtable_t pte)
2005-04-16 15:20:36 -07:00
{
set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
}
/*
* Initialize a new pmd table with invalid pointers.
*/
extern void pmd_init(void *addr);
#ifndef __PAGETABLE_PMD_FOLDED
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
{
set_pud(pud, __pud((unsigned long)pmd));
}
#endif
2005-04-16 15:20:36 -07:00
/*
* Initialize a new pgd table with invalid pointers.
2005-04-16 15:20:36 -07:00
*/
extern void pgd_init(void *addr);
2017-02-02 01:21:35 +00:00
extern pgd_t *pgd_alloc(struct mm_struct *mm);
2005-04-16 15:20:36 -07:00
2026-01-27 20:12:57 +08:00
#define __pte_free_tlb(tlb, pte, address) tlb_remove_ptdesc((tlb), page_ptdesc(pte))
2005-04-16 15:20:36 -07:00
#ifndef __PAGETABLE_PMD_FOLDED
2005-04-16 15:20:36 -07:00
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
{
pmd_t *pmd;
struct ptdesc *ptdesc;
2005-04-16 15:20:36 -07:00
ptdesc = pagetable_alloc(GFP_KERNEL_ACCOUNT, PMD_TABLE_ORDER);
if (!ptdesc)
return NULL;
if (!pagetable_pmd_ctor(mm, ptdesc)) {
pagetable_free(ptdesc);
return NULL;
}
pmd = ptdesc_address(ptdesc);
pmd_init(pmd);
2005-04-16 15:20:36 -07:00
return pmd;
}
2026-01-27 20:12:57 +08:00
#define __pmd_free_tlb(tlb, x, addr) tlb_remove_ptdesc((tlb), virt_to_ptdesc(x))
2005-04-16 15:20:36 -07:00
#endif
#ifndef __PAGETABLE_PUD_FOLDED
static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
{
pud_t *pud;
2025-11-07 15:27:58 -08:00
struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL, PUD_TABLE_ORDER);
if (!ptdesc)
return NULL;
2023-09-18 14:31:42 +08:00
pagetable_pud_ctor(ptdesc);
pud = ptdesc_address(ptdesc);
pud_init(pud);
return pud;
}
static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud)
{
set_p4d(p4d, __p4d((unsigned long)pud));
}
2026-01-27 20:12:57 +08:00
#define __pud_free_tlb(tlb, x, addr) tlb_remove_ptdesc((tlb), virt_to_ptdesc(x))
#endif /* __PAGETABLE_PUD_FOLDED */
2005-04-16 15:20:36 -07:00
#endif /* _ASM_PGALLOC_H */