aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/task_mmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/proc/task_mmu.c')
-rw-r--r--fs/proc/task_mmu.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 8faaebdc6b02..42b5cf5d0326 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -506,9 +506,9 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
506 pte_t *pte; 506 pte_t *pte;
507 spinlock_t *ptl; 507 spinlock_t *ptl;
508 508
509 if (pmd_trans_huge_lock(pmd, vma) == 1) { 509 if (pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
510 smaps_pte_entry(*(pte_t *)pmd, addr, HPAGE_PMD_SIZE, walk); 510 smaps_pte_entry(*(pte_t *)pmd, addr, HPAGE_PMD_SIZE, walk);
511 spin_unlock(&walk->mm->page_table_lock); 511 spin_unlock(ptl);
512 mss->anonymous_thp += HPAGE_PMD_SIZE; 512 mss->anonymous_thp += HPAGE_PMD_SIZE;
513 return 0; 513 return 0;
514 } 514 }
@@ -999,13 +999,14 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
999{ 999{
1000 struct vm_area_struct *vma; 1000 struct vm_area_struct *vma;
1001 struct pagemapread *pm = walk->private; 1001 struct pagemapread *pm = walk->private;
1002 spinlock_t *ptl;
1002 pte_t *pte; 1003 pte_t *pte;
1003 int err = 0; 1004 int err = 0;
1004 pagemap_entry_t pme = make_pme(PM_NOT_PRESENT(pm->v2)); 1005 pagemap_entry_t pme = make_pme(PM_NOT_PRESENT(pm->v2));
1005 1006
1006 /* find the first VMA at or above 'addr' */ 1007 /* find the first VMA at or above 'addr' */
1007 vma = find_vma(walk->mm, addr); 1008 vma = find_vma(walk->mm, addr);
1008 if (vma && pmd_trans_huge_lock(pmd, vma) == 1) { 1009 if (vma && pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
1009 int pmd_flags2; 1010 int pmd_flags2;
1010 1011
1011 if ((vma->vm_flags & VM_SOFTDIRTY) || pmd_soft_dirty(*pmd)) 1012 if ((vma->vm_flags & VM_SOFTDIRTY) || pmd_soft_dirty(*pmd))
@@ -1023,7 +1024,7 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
1023 if (err) 1024 if (err)
1024 break; 1025 break;
1025 } 1026 }
1026 spin_unlock(&walk->mm->page_table_lock); 1027 spin_unlock(ptl);
1027 return err; 1028 return err;
1028 } 1029 }
1029 1030
@@ -1325,7 +1326,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1325 1326
1326 md = walk->private; 1327 md = walk->private;
1327 1328
1328 if (pmd_trans_huge_lock(pmd, md->vma) == 1) { 1329 if (pmd_trans_huge_lock(pmd, md->vma, &ptl) == 1) {
1329 pte_t huge_pte = *(pte_t *)pmd; 1330 pte_t huge_pte = *(pte_t *)pmd;
1330 struct page *page; 1331 struct page *page;
1331 1332
@@ -1333,7 +1334,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1333 if (page) 1334 if (page)
1334 gather_stats(page, md, pte_dirty(huge_pte), 1335 gather_stats(page, md, pte_dirty(huge_pte),
1335 HPAGE_PMD_SIZE/PAGE_SIZE); 1336 HPAGE_PMD_SIZE/PAGE_SIZE);
1336 spin_unlock(&walk->mm->page_table_lock); 1337 spin_unlock(ptl);
1337 return 0; 1338 return 0;
1338 } 1339 }
1339 1340