x86: put paravirt stubs into common asm/pgalloc.h
[linux-2.6.git] / include / asm-x86 / pgalloc_32.h
1 #ifndef _I386_PGALLOC_H
2 #define _I386_PGALLOC_H
3
4 static inline void pmd_populate_kernel(struct mm_struct *mm,
5                                        pmd_t *pmd, pte_t *pte)
6 {
7         paravirt_alloc_pt(mm, __pa(pte) >> PAGE_SHIFT);
8         set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE));
9 }
10
11 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
12 {
13         unsigned long pfn = page_to_pfn(pte);
14
15         paravirt_alloc_pt(mm, pfn);
16         set_pmd(pmd, __pmd(((pteval_t)pfn << PAGE_SHIFT) | _PAGE_TABLE));
17 }
18 #define pmd_pgtable(pmd) pmd_page(pmd)
19
20 /*
21  * Allocate and free page tables.
22  */
23
24 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
25 {
26         free_page((unsigned long)pte);
27 }
28
29 static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
30 {
31         pgtable_page_dtor(pte);
32         __free_page(pte);
33 }
34
35
36 extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
37
38 #ifdef CONFIG_X86_PAE
39 /*
40  * In the PAE case we free the pmds as part of the pgd.
41  */
42 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
43 {
44         return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
45 }
46
47 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
48 {
49         BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
50         free_page((unsigned long)pmd);
51 }
52
53 extern void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
54
55 extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
56
57 #endif  /* CONFIG_X86_PAE */
58
59 #endif /* _I386_PGALLOC_H */