diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 19 |
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 | ||
2478 | void __split_huge_page_pmd(struct mm_struct *mm, pmd_t *pmd) | 2478 | void __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 | ||
2503 | void 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 | |||
2498 | static void split_huge_page_address(struct mm_struct *mm, | 2513 | static 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 | ||
2515 | void __vma_adjust_trans_huge(struct vm_area_struct *vma, | 2530 | void __vma_adjust_trans_huge(struct vm_area_struct *vma, |