diff options
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 3d0aab9ee80d..e5828875f7bb 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -4403,7 +4403,9 @@ int hugetlb_reserve_pages(struct inode *inode, | |||
4403 | return 0; | 4403 | return 0; |
4404 | out_err: | 4404 | out_err: |
4405 | if (!vma || vma->vm_flags & VM_MAYSHARE) | 4405 | if (!vma || vma->vm_flags & VM_MAYSHARE) |
4406 | region_abort(resv_map, from, to); | 4406 | /* Don't call region_abort if region_chg failed */ |
4407 | if (chg >= 0) | ||
4408 | region_abort(resv_map, from, to); | ||
4407 | if (vma && is_vma_resv_set(vma, HPAGE_RESV_OWNER)) | 4409 | if (vma && is_vma_resv_set(vma, HPAGE_RESV_OWNER)) |
4408 | kref_put(&resv_map->refs, resv_map_release); | 4410 | kref_put(&resv_map->refs, resv_map_release); |
4409 | return ret; | 4411 | return ret; |
@@ -4651,6 +4653,7 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address, | |||
4651 | { | 4653 | { |
4652 | struct page *page = NULL; | 4654 | struct page *page = NULL; |
4653 | spinlock_t *ptl; | 4655 | spinlock_t *ptl; |
4656 | pte_t pte; | ||
4654 | retry: | 4657 | retry: |
4655 | ptl = pmd_lockptr(mm, pmd); | 4658 | ptl = pmd_lockptr(mm, pmd); |
4656 | spin_lock(ptl); | 4659 | spin_lock(ptl); |
@@ -4660,12 +4663,13 @@ retry: | |||
4660 | */ | 4663 | */ |
4661 | if (!pmd_huge(*pmd)) | 4664 | if (!pmd_huge(*pmd)) |
4662 | goto out; | 4665 | goto out; |
4663 | if (pmd_present(*pmd)) { | 4666 | pte = huge_ptep_get((pte_t *)pmd); |
4667 | if (pte_present(pte)) { | ||
4664 | page = pmd_page(*pmd) + ((address & ~PMD_MASK) >> PAGE_SHIFT); | 4668 | page = pmd_page(*pmd) + ((address & ~PMD_MASK) >> PAGE_SHIFT); |
4665 | if (flags & FOLL_GET) | 4669 | if (flags & FOLL_GET) |
4666 | get_page(page); | 4670 | get_page(page); |
4667 | } else { | 4671 | } else { |
4668 | if (is_hugetlb_entry_migration(huge_ptep_get((pte_t *)pmd))) { | 4672 | if (is_hugetlb_entry_migration(pte)) { |
4669 | spin_unlock(ptl); | 4673 | spin_unlock(ptl); |
4670 | __migration_entry_wait(mm, (pte_t *)pmd, ptl); | 4674 | __migration_entry_wait(mm, (pte_t *)pmd, ptl); |
4671 | goto retry; | 4675 | goto retry; |