aboutsummaryrefslogtreecommitdiffstats
path: root/mm/huge_memory.c
diff options
context:
space:
mode:
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,