|
@@ -163,13 +163,10 @@ static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr,
|
|
pte_unmap(pte);
|
|
pte_unmap(pte);
|
|
}
|
|
}
|
|
|
|
|
|
-void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
|
|
|
- pmd_t *pmdp, pmd_t pmd)
|
|
|
|
-{
|
|
|
|
- pmd_t orig = *pmdp;
|
|
|
|
-
|
|
|
|
- *pmdp = pmd;
|
|
|
|
|
|
|
|
|
|
+static void __set_pmd_acct(struct mm_struct *mm, unsigned long addr,
|
|
|
|
+ pmd_t orig, pmd_t pmd)
|
|
|
|
+{
|
|
if (mm == &init_mm)
|
|
if (mm == &init_mm)
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -219,6 +216,15 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
|
|
|
+ pmd_t *pmdp, pmd_t pmd)
|
|
|
|
+{
|
|
|
|
+ pmd_t orig = *pmdp;
|
|
|
|
+
|
|
|
|
+ *pmdp = pmd;
|
|
|
|
+ __set_pmd_acct(mm, addr, orig, pmd);
|
|
|
|
+}
|
|
|
|
+
|
|
static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
|
static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
|
unsigned long address, pmd_t *pmdp, pmd_t pmd)
|
|
unsigned long address, pmd_t *pmdp, pmd_t pmd)
|
|
{
|
|
{
|
|
@@ -227,6 +233,7 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
|
do {
|
|
do {
|
|
old = *pmdp;
|
|
old = *pmdp;
|
|
} while (cmpxchg64(&pmdp->pmd, old.pmd, pmd.pmd) != old.pmd);
|
|
} while (cmpxchg64(&pmdp->pmd, old.pmd, pmd.pmd) != old.pmd);
|
|
|
|
+ __set_pmd_acct(vma->vm_mm, address, old, pmd);
|
|
|
|
|
|
return old;
|
|
return old;
|
|
}
|
|
}
|