aboutsummaryrefslogtreecommitdiffstats
path: root/mm/huge_memory.c
diff options
context:
space:
mode:
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>2012-12-12 16:50:59 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-12 20:38:31 -0500
commite180377f1ae48b3cbc559c9875d9b038f7f000c6 (patch)
treec51e0db181acc0372479bce5cd68b99abca7d8bb /mm/huge_memory.c
parentcad7f613c4d010e1d0f05c9a4fb33c7ae40ba115 (diff)
thp: change split_huge_page_pmd() interface
Pass vma instead of mm and add address parameter. In most cases we already have vma on the stack. We provides split_huge_page_pmd_mm() for few cases when we have mm, but not vma. This change is preparation to huge zero pmd splitting implementation. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: "H. Peter Anvin" <hpa@linux.intel.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r--mm/huge_memory.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 7742fb36eb4d..de6aa5f3fdd2 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2475,9 +2475,14 @@ static int khugepaged(void *none)
2475 return 0; 2475 return 0;
2476} 2476}
2477 2477
2478void __split_huge_page_pmd(struct mm_struct *mm, pmd_t *pmd) 2478void __split_huge_page_pmd(struct vm_area_struct *vma, unsigned long address,
2479 pmd_t *pmd)
2479{ 2480{
2480 struct page *page; 2481 struct page *page;
2482 unsigned long haddr = address & HPAGE_PMD_MASK;
2483 struct mm_struct *mm = vma->vm_mm;
2484
2485 BUG_ON(vma->vm_start > haddr || vma->vm_end < haddr + HPAGE_PMD_SIZE);
2481 2486
2482 spin_lock(&mm->page_table_lock); 2487 spin_lock(&mm->page_table_lock);
2483 if (unlikely(!pmd_trans_huge(*pmd))) { 2488 if (unlikely(!pmd_trans_huge(*pmd))) {
@@ -2495,6 +2500,16 @@ void __split_huge_page_pmd(struct mm_struct *mm, pmd_t *pmd)
2495 BUG_ON(pmd_trans_huge(*pmd)); 2500 BUG_ON(pmd_trans_huge(*pmd));
2496} 2501}
2497 2502
2503void split_huge_page_pmd_mm(struct mm_struct *mm, unsigned long address,
2504 pmd_t *pmd)
2505{
2506 struct vm_area_struct *vma;
2507
2508 vma = find_vma(mm, address);
2509 BUG_ON(vma == NULL);
2510 split_huge_page_pmd(vma, address, pmd);
2511}
2512
2498static void split_huge_page_address(struct mm_struct *mm, 2513static void split_huge_page_address(struct mm_struct *mm,
2499 unsigned long address) 2514 unsigned long address)
2500{ 2515{
@@ -2509,7 +2524,7 @@ static void split_huge_page_address(struct mm_struct *mm,
2509 * Caller holds the mmap_sem write mode, so a huge pmd cannot 2524 * Caller holds the mmap_sem write mode, so a huge pmd cannot
2510 * materialize from under us. 2525 * materialize from under us.
2511 */ 2526 */
2512 split_huge_page_pmd(mm, pmd); 2527 split_huge_page_pmd_mm(mm, address, pmd);
2513} 2528}
2514 2529
2515void __vma_adjust_trans_huge(struct vm_area_struct *vma, 2530void __vma_adjust_trans_huge(struct vm_area_struct *vma,