aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/task_mmu.c
diff options
context:
space:
mode:
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>2013-11-14 17:30:54 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-14 19:32:14 -0500
commitbf929152e9f6c49b66fad4ebf08cc95b02ce48f5 (patch)
tree21b54239e0ad98f12a44039047ed96d775e6c67d /fs/proc/task_mmu.c
parent9a86cb7bdc4ccbe3f99a1ca275b90a322a90f9ce (diff)
mm, thp: change pmd_trans_huge_lock() to return taken lock
With split ptlock it's important to know which lock pmd_trans_huge_lock() took. This patch adds one more parameter to the function to return the lock. In most places migration to new api is trivial. Exception is move_huge_pmd(): we need to take two locks if pmd tables are different. Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Tested-by: Alex Thorlton <athorlton@sgi.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: "Eric W . Biederman" <ebiederm@xmission.com> Cc: "Paul E . McKenney" <paulmck@linux.vnet.ibm.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andi Kleen <ak@linux.intel.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Dave Jones <davej@redhat.com> Cc: David Howells <dhowells@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Kees Cook <keescook@chromium.org> Cc: Mel Gorman <mgorman@suse.de> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rik van Riel <riel@redhat.com> Cc: Robin Holt <robinmholt@gmail.com> Cc: Sedat Dilek <sedat.dilek@gmail.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Hugh Dickins <hughd@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
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