diff options
Diffstat (limited to 'arch/mips/mm/pgtable-64.c')
| -rw-r--r-- | arch/mips/mm/pgtable-64.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/mips/mm/pgtable-64.c b/arch/mips/mm/pgtable-64.c index 25407794edb4..ee331bbd8f8a 100644 --- a/arch/mips/mm/pgtable-64.c +++ b/arch/mips/mm/pgtable-64.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <asm/fixmap.h> | 11 | #include <asm/fixmap.h> |
| 12 | #include <asm/pgtable.h> | 12 | #include <asm/pgtable.h> |
| 13 | #include <asm/pgalloc.h> | 13 | #include <asm/pgalloc.h> |
| 14 | #include <asm/tlbflush.h> | ||
| 14 | 15 | ||
| 15 | void pgd_init(unsigned long page) | 16 | void pgd_init(unsigned long page) |
| 16 | { | 17 | { |
| @@ -61,6 +62,36 @@ void pmd_init(unsigned long addr, unsigned long pagetable) | |||
| 61 | } | 62 | } |
| 62 | #endif | 63 | #endif |
| 63 | 64 | ||
| 65 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 66 | |||
| 67 | void pmdp_splitting_flush(struct vm_area_struct *vma, | ||
| 68 | unsigned long address, | ||
| 69 | pmd_t *pmdp) | ||
| 70 | { | ||
| 71 | if (!pmd_trans_splitting(*pmdp)) { | ||
| 72 | pmd_t pmd = pmd_mksplitting(*pmdp); | ||
| 73 | set_pmd_at(vma->vm_mm, address, pmdp, pmd); | ||
| 74 | } | ||
| 75 | } | ||
| 76 | |||
| 77 | #endif | ||
| 78 | |||
| 79 | pmd_t mk_pmd(struct page *page, pgprot_t prot) | ||
| 80 | { | ||
| 81 | pmd_t pmd; | ||
| 82 | |||
| 83 | pmd_val(pmd) = (page_to_pfn(page) << _PFN_SHIFT) | pgprot_val(prot); | ||
| 84 | |||
| 85 | return pmd; | ||
| 86 | } | ||
| 87 | |||
| 88 | void set_pmd_at(struct mm_struct *mm, unsigned long addr, | ||
| 89 | pmd_t *pmdp, pmd_t pmd) | ||
| 90 | { | ||
| 91 | *pmdp = pmd; | ||
| 92 | flush_tlb_all(); | ||
| 93 | } | ||
| 94 | |||
| 64 | void __init pagetable_init(void) | 95 | void __init pagetable_init(void) |
| 65 | { | 96 | { |
| 66 | unsigned long vaddr; | 97 | unsigned long vaddr; |
