linux/arch/x86/include/asm/pgalloc.h
<<
>>
Prefs
   1#ifndef _ASM_X86_PGALLOC_H
   2#define _ASM_X86_PGALLOC_H
   3
   4#include <linux/threads.h>
   5#include <linux/mm.h>           /* for struct page */
   6#include <linux/pagemap.h>
   7
   8static inline int  __paravirt_pgd_alloc(struct mm_struct *mm) { return 0; }
   9
  10#ifdef CONFIG_PARAVIRT
  11#include <asm/paravirt.h>
  12#else
  13#define paravirt_pgd_alloc(mm)  __paravirt_pgd_alloc(mm)
  14static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd) {}
  15static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn)  {}
  16static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn)  {}
  17static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn,
  18                                            unsigned long start, unsigned long count) {}
  19static inline void paravirt_alloc_pud(struct mm_struct *mm, unsigned long pfn)  {}
  20static inline void paravirt_release_pte(unsigned long pfn) {}
  21static inline void paravirt_release_pmd(unsigned long pfn) {}
  22static inline void paravirt_release_pud(unsigned long pfn) {}
  23#endif
  24
  25/*
  26 * Allocate and free page tables.
  27 */
  28extern pgd_t *pgd_alloc(struct mm_struct *);
  29extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
  30
  31extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
  32extern pgtable_t pte_alloc_one(struct mm_struct *, unsigned long);
  33
  34/* Should really implement gc for free page table pages. This could be
  35   done with a reference count in struct page. */
  36
  37static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  38{
  39        BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
  40        free_page((unsigned long)pte);
  41}
  42
  43static inline void pte_free(struct mm_struct *mm, struct page *pte)
  44{
  45        __free_page(pte);
  46}
  47
  48extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
  49
  50static inline void pmd_populate_kernel(struct mm_struct *mm,
  51                                       pmd_t *pmd, pte_t *pte)
  52{
  53        paravirt_alloc_pte(mm, __pa(pte) >> PAGE_SHIFT);
  54        set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE));
  55}
  56
  57static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  58                                struct page *pte)
  59{
  60        unsigned long pfn = page_to_pfn(pte);
  61
  62        paravirt_alloc_pte(mm, pfn);
  63        set_pmd(pmd, __pmd(((pteval_t)pfn << PAGE_SHIFT) | _PAGE_TABLE));
  64}
  65
  66#define pmd_pgtable(pmd) pmd_page(pmd)
  67
  68#if PAGETABLE_LEVELS > 2
  69static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
  70{
  71        return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
  72}
  73
  74static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
  75{
  76        BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
  77        free_page((unsigned long)pmd);
  78}
  79
  80extern void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
  81
  82#ifdef CONFIG_X86_PAE
  83extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
  84#else   /* !CONFIG_X86_PAE */
  85static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
  86{
  87        paravirt_alloc_pmd(mm, __pa(pmd) >> PAGE_SHIFT);
  88        set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd)));
  89}
  90#endif  /* CONFIG_X86_PAE */
  91
  92#if PAGETABLE_LEVELS > 3
  93static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
  94{
  95        paravirt_alloc_pud(mm, __pa(pud) >> PAGE_SHIFT);
  96        set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud)));
  97}
  98
  99static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
 100{
 101        return (pud_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
 102}
 103
 104static inline void pud_free(struct mm_struct *mm, pud_t *pud)
 105{
 106        BUG_ON((unsigned long)pud & (PAGE_SIZE-1));
 107        free_page((unsigned long)pud);
 108}
 109
 110extern void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
 111#endif  /* PAGETABLE_LEVELS > 3 */
 112#endif  /* PAGETABLE_LEVELS > 2 */
 113
 114#endif /* _ASM_X86_PGALLOC_H */
 115
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.