diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/mm/memory.c b/mm/memory.c index 054250ee4a68..7bd22a621817 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2994,17 +2994,16 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2994 | if (unlikely(!PageSwapCache(page) || page_private(page) != entry.val)) | 2994 | if (unlikely(!PageSwapCache(page) || page_private(page) != entry.val)) |
2995 | goto out_page; | 2995 | goto out_page; |
2996 | 2996 | ||
2997 | if (ksm_might_need_to_copy(page, vma, address)) { | 2997 | swapcache = page; |
2998 | swapcache = page; | 2998 | page = ksm_might_need_to_copy(page, vma, address); |
2999 | page = ksm_does_need_to_copy(page, vma, address); | 2999 | if (unlikely(!page)) { |
3000 | 3000 | ret = VM_FAULT_OOM; | |
3001 | if (unlikely(!page)) { | 3001 | page = swapcache; |
3002 | ret = VM_FAULT_OOM; | 3002 | swapcache = NULL; |
3003 | page = swapcache; | 3003 | goto out_page; |
3004 | swapcache = NULL; | ||
3005 | goto out_page; | ||
3006 | } | ||
3007 | } | 3004 | } |
3005 | if (page == swapcache) | ||
3006 | swapcache = NULL; | ||
3008 | 3007 | ||
3009 | if (mem_cgroup_try_charge_swapin(mm, page, GFP_KERNEL, &ptr)) { | 3008 | if (mem_cgroup_try_charge_swapin(mm, page, GFP_KERNEL, &ptr)) { |
3010 | ret = VM_FAULT_OOM; | 3009 | ret = VM_FAULT_OOM; |