home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / x86 / include / asm / pgalloc.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-09  |  3.5 KB  |  116 lines

  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.  
  8. static 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)
  14. static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd) {}
  15. static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn)    {}
  16. static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn)    {}
  17. static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn,
  18.                         unsigned long start, unsigned long count) {}
  19. static inline void paravirt_alloc_pud(struct mm_struct *mm, unsigned long pfn)    {}
  20. static inline void paravirt_release_pte(unsigned long pfn) {}
  21. static inline void paravirt_release_pmd(unsigned long pfn) {}
  22. static inline void paravirt_release_pud(unsigned long pfn) {}
  23. #endif
  24.  
  25. /*
  26.  * Allocate and free page tables.
  27.  */
  28. extern pgd_t *pgd_alloc(struct mm_struct *);
  29. extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
  30.  
  31. extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
  32. extern 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.  
  37. static 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.  
  43. static inline void pte_free(struct mm_struct *mm, struct page *pte)
  44. {
  45.     pgtable_page_dtor(pte);
  46.     __free_page(pte);
  47. }
  48.  
  49. extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
  50.  
  51. static inline void pmd_populate_kernel(struct mm_struct *mm,
  52.                        pmd_t *pmd, pte_t *pte)
  53. {
  54.     paravirt_alloc_pte(mm, __pa(pte) >> PAGE_SHIFT);
  55.     set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE));
  56. }
  57.  
  58. static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  59.                 struct page *pte)
  60. {
  61.     unsigned long pfn = page_to_pfn(pte);
  62.  
  63.     paravirt_alloc_pte(mm, pfn);
  64.     set_pmd(pmd, __pmd(((pteval_t)pfn << PAGE_SHIFT) | _PAGE_TABLE));
  65. }
  66.  
  67. #define pmd_pgtable(pmd) pmd_page(pmd)
  68.  
  69. #if PAGETABLE_LEVELS > 2
  70. static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
  71. {
  72.     return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
  73. }
  74.  
  75. static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
  76. {
  77.     BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
  78.     free_page((unsigned long)pmd);
  79. }
  80.  
  81. extern void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
  82.  
  83. #ifdef CONFIG_X86_PAE
  84. extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
  85. #else    /* !CONFIG_X86_PAE */
  86. static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
  87. {
  88.     paravirt_alloc_pmd(mm, __pa(pmd) >> PAGE_SHIFT);
  89.     set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd)));
  90. }
  91. #endif    /* CONFIG_X86_PAE */
  92.  
  93. #if PAGETABLE_LEVELS > 3
  94. static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
  95. {
  96.     paravirt_alloc_pud(mm, __pa(pud) >> PAGE_SHIFT);
  97.     set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud)));
  98. }
  99.  
  100. static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
  101. {
  102.     return (pud_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
  103. }
  104.  
  105. static inline void pud_free(struct mm_struct *mm, pud_t *pud)
  106. {
  107.     BUG_ON((unsigned long)pud & (PAGE_SIZE-1));
  108.     free_page((unsigned long)pud);
  109. }
  110.  
  111. extern void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
  112. #endif    /* PAGETABLE_LEVELS > 3 */
  113. #endif    /* PAGETABLE_LEVELS > 2 */
  114.  
  115. #endif /* _ASM_X86_PGALLOC_H */
  116.