diff options
author | Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | 2013-11-14 17:30:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-14 19:32:14 -0500 |
commit | bf929152e9f6c49b66fad4ebf08cc95b02ce48f5 (patch) | |
tree | 21b54239e0ad98f12a44039047ed96d775e6c67d /fs/proc/task_mmu.c | |
parent | 9a86cb7bdc4ccbe3f99a1ca275b90a322a90f9ce (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.c | 13 |
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 | ||