diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/mm/memory.c b/mm/memory.c index be6a0c0d4ae0..22dfa617bddb 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -3348,6 +3348,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 3348 | if (ret & VM_FAULT_LOCKED) | 3348 | if (ret & VM_FAULT_LOCKED) |
| 3349 | unlock_page(vmf.page); | 3349 | unlock_page(vmf.page); |
| 3350 | ret = VM_FAULT_HWPOISON; | 3350 | ret = VM_FAULT_HWPOISON; |
| 3351 | page_cache_release(vmf.page); | ||
| 3351 | goto uncharge_out; | 3352 | goto uncharge_out; |
| 3352 | } | 3353 | } |
| 3353 | 3354 | ||
| @@ -3703,7 +3704,6 @@ static int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 3703 | if (unlikely(is_vm_hugetlb_page(vma))) | 3704 | if (unlikely(is_vm_hugetlb_page(vma))) |
| 3704 | return hugetlb_fault(mm, vma, address, flags); | 3705 | return hugetlb_fault(mm, vma, address, flags); |
| 3705 | 3706 | ||
| 3706 | retry: | ||
| 3707 | pgd = pgd_offset(mm, address); | 3707 | pgd = pgd_offset(mm, address); |
| 3708 | pud = pud_alloc(mm, pgd, address); | 3708 | pud = pud_alloc(mm, pgd, address); |
| 3709 | if (!pud) | 3709 | if (!pud) |
| @@ -3741,20 +3741,13 @@ retry: | |||
| 3741 | if (dirty && !pmd_write(orig_pmd)) { | 3741 | if (dirty && !pmd_write(orig_pmd)) { |
| 3742 | ret = do_huge_pmd_wp_page(mm, vma, address, pmd, | 3742 | ret = do_huge_pmd_wp_page(mm, vma, address, pmd, |
| 3743 | orig_pmd); | 3743 | orig_pmd); |
| 3744 | /* | 3744 | if (!(ret & VM_FAULT_FALLBACK)) |
| 3745 | * If COW results in an oom, the huge pmd will | 3745 | return ret; |
| 3746 | * have been split, so retry the fault on the | ||
| 3747 | * pte for a smaller charge. | ||
| 3748 | */ | ||
| 3749 | if (unlikely(ret & VM_FAULT_OOM)) | ||
| 3750 | goto retry; | ||
| 3751 | return ret; | ||
| 3752 | } else { | 3746 | } else { |
| 3753 | huge_pmd_set_accessed(mm, vma, address, pmd, | 3747 | huge_pmd_set_accessed(mm, vma, address, pmd, |
| 3754 | orig_pmd, dirty); | 3748 | orig_pmd, dirty); |
| 3749 | return 0; | ||
| 3755 | } | 3750 | } |
| 3756 | |||
| 3757 | return 0; | ||
| 3758 | } | 3751 | } |
| 3759 | } | 3752 | } |
| 3760 | 3753 | ||
