diff options
author | Jan Kara <jack@suse.cz> | 2016-12-14 18:07:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-14 19:04:09 -0500 |
commit | 667240e0f2e13e792a5af99b3c34dfab12ef125b (patch) | |
tree | f6880fe19d639a43c05b90a7e2c3e13161e0c81e | |
parent | 0721ec8bc156fafc9057ec1df95cdb3bbc3cbae8 (diff) |
mm: use passed vm_fault structure in __do_fault()
Instead of creating another vm_fault structure, use the one passed to
__do_fault() for passing arguments into fault handler.
Link: http://lkml.kernel.org/r/1479460644-25076-5-git-send-email-jack@suse.cz
Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/memory.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/mm/memory.c b/mm/memory.c index c514b4a07a7a..cbc6d47fda73 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2848,37 +2848,31 @@ static int __do_fault(struct vm_fault *vmf, struct page *cow_page, | |||
2848 | struct page **page, void **entry) | 2848 | struct page **page, void **entry) |
2849 | { | 2849 | { |
2850 | struct vm_area_struct *vma = vmf->vma; | 2850 | struct vm_area_struct *vma = vmf->vma; |
2851 | struct vm_fault vmf2; | ||
2852 | int ret; | 2851 | int ret; |
2853 | 2852 | ||
2854 | vmf2.address = vmf->address; | 2853 | vmf->cow_page = cow_page; |
2855 | vmf2.pgoff = vmf->pgoff; | ||
2856 | vmf2.flags = vmf->flags; | ||
2857 | vmf2.page = NULL; | ||
2858 | vmf2.gfp_mask = __get_fault_gfp_mask(vma); | ||
2859 | vmf2.cow_page = cow_page; | ||
2860 | 2854 | ||
2861 | ret = vma->vm_ops->fault(vma, &vmf2); | 2855 | ret = vma->vm_ops->fault(vma, vmf); |
2862 | if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) | 2856 | if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE | VM_FAULT_RETRY))) |
2863 | return ret; | 2857 | return ret; |
2864 | if (ret & VM_FAULT_DAX_LOCKED) { | 2858 | if (ret & VM_FAULT_DAX_LOCKED) { |
2865 | *entry = vmf2.entry; | 2859 | *entry = vmf->entry; |
2866 | return ret; | 2860 | return ret; |
2867 | } | 2861 | } |
2868 | 2862 | ||
2869 | if (unlikely(PageHWPoison(vmf2.page))) { | 2863 | if (unlikely(PageHWPoison(vmf->page))) { |
2870 | if (ret & VM_FAULT_LOCKED) | 2864 | if (ret & VM_FAULT_LOCKED) |
2871 | unlock_page(vmf2.page); | 2865 | unlock_page(vmf->page); |
2872 | put_page(vmf2.page); | 2866 | put_page(vmf->page); |
2873 | return VM_FAULT_HWPOISON; | 2867 | return VM_FAULT_HWPOISON; |
2874 | } | 2868 | } |
2875 | 2869 | ||
2876 | if (unlikely(!(ret & VM_FAULT_LOCKED))) | 2870 | if (unlikely(!(ret & VM_FAULT_LOCKED))) |
2877 | lock_page(vmf2.page); | 2871 | lock_page(vmf->page); |
2878 | else | 2872 | else |
2879 | VM_BUG_ON_PAGE(!PageLocked(vmf2.page), vmf2.page); | 2873 | VM_BUG_ON_PAGE(!PageLocked(vmf->page), vmf->page); |
2880 | 2874 | ||
2881 | *page = vmf2.page; | 2875 | *page = vmf->page; |
2882 | return ret; | 2876 | return ret; |
2883 | } | 2877 | } |
2884 | 2878 | ||
@@ -3614,6 +3608,7 @@ static int __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, | |||
3614 | .address = address & PAGE_MASK, | 3608 | .address = address & PAGE_MASK, |
3615 | .flags = flags, | 3609 | .flags = flags, |
3616 | .pgoff = linear_page_index(vma, address), | 3610 | .pgoff = linear_page_index(vma, address), |
3611 | .gfp_mask = __get_fault_gfp_mask(vma), | ||
3617 | }; | 3612 | }; |
3618 | struct mm_struct *mm = vma->vm_mm; | 3613 | struct mm_struct *mm = vma->vm_mm; |
3619 | pgd_t *pgd; | 3614 | pgd_t *pgd; |