|
@@ -435,6 +435,11 @@ static inline void pte_update(struct mm_struct *mm, unsigned long addr,
|
|
|
{
|
|
|
PVOP_VCALL3(pv_mmu_ops.pte_update, mm, addr, ptep);
|
|
|
}
|
|
|
+static inline void pmd_update(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pmd_t *pmdp)
|
|
|
+{
|
|
|
+ PVOP_VCALL3(pv_mmu_ops.pmd_update, mm, addr, pmdp);
|
|
|
+}
|
|
|
|
|
|
static inline void pte_update_defer(struct mm_struct *mm, unsigned long addr,
|
|
|
pte_t *ptep)
|
|
@@ -442,6 +447,12 @@ static inline void pte_update_defer(struct mm_struct *mm, unsigned long addr,
|
|
|
PVOP_VCALL3(pv_mmu_ops.pte_update_defer, mm, addr, ptep);
|
|
|
}
|
|
|
|
|
|
+static inline void pmd_update_defer(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pmd_t *pmdp)
|
|
|
+{
|
|
|
+ PVOP_VCALL3(pv_mmu_ops.pmd_update_defer, mm, addr, pmdp);
|
|
|
+}
|
|
|
+
|
|
|
static inline pte_t __pte(pteval_t val)
|
|
|
{
|
|
|
pteval_t ret;
|
|
@@ -543,6 +554,20 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
|
PVOP_VCALL4(pv_mmu_ops.set_pte_at, mm, addr, ptep, pte.pte);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
|
+static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
|
|
+ pmd_t *pmdp, pmd_t pmd)
|
|
|
+{
|
|
|
+#if PAGETABLE_LEVELS >= 3
|
|
|
+ if (sizeof(pmdval_t) > sizeof(long))
|
|
|
+ /* 5 arg words */
|
|
|
+ pv_mmu_ops.set_pmd_at(mm, addr, pmdp, pmd);
|
|
|
+ else
|
|
|
+ PVOP_VCALL4(pv_mmu_ops.set_pmd_at, mm, addr, pmdp, pmd.pmd);
|
|
|
+#endif
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
|
|
|
{
|
|
|
pmdval_t val = native_pmd_val(pmd);
|