diff options
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index 4c524f7bd0bf..0883b4912ff7 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -1106,15 +1106,14 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, | |||
1106 | if (unlikely(!page)) | 1106 | if (unlikely(!page)) |
1107 | return -ENOMEM; | 1107 | return -ENOMEM; |
1108 | 1108 | ||
1109 | if (mem_cgroup_try_charge_swapin(vma->vm_mm, page, | 1109 | if (mem_cgroup_try_charge(page, vma->vm_mm, GFP_KERNEL, &memcg)) { |
1110 | GFP_KERNEL, &memcg)) { | ||
1111 | ret = -ENOMEM; | 1110 | ret = -ENOMEM; |
1112 | goto out_nolock; | 1111 | goto out_nolock; |
1113 | } | 1112 | } |
1114 | 1113 | ||
1115 | pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); | 1114 | pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); |
1116 | if (unlikely(!maybe_same_pte(*pte, swp_entry_to_pte(entry)))) { | 1115 | if (unlikely(!maybe_same_pte(*pte, swp_entry_to_pte(entry)))) { |
1117 | mem_cgroup_cancel_charge_swapin(memcg); | 1116 | mem_cgroup_cancel_charge(page, memcg); |
1118 | ret = 0; | 1117 | ret = 0; |
1119 | goto out; | 1118 | goto out; |
1120 | } | 1119 | } |
@@ -1124,11 +1123,14 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, | |||
1124 | get_page(page); | 1123 | get_page(page); |
1125 | set_pte_at(vma->vm_mm, addr, pte, | 1124 | set_pte_at(vma->vm_mm, addr, pte, |
1126 | pte_mkold(mk_pte(page, vma->vm_page_prot))); | 1125 | pte_mkold(mk_pte(page, vma->vm_page_prot))); |
1127 | if (page == swapcache) | 1126 | if (page == swapcache) { |
1128 | page_add_anon_rmap(page, vma, addr); | 1127 | page_add_anon_rmap(page, vma, addr); |
1129 | else /* ksm created a completely new copy */ | 1128 | mem_cgroup_commit_charge(page, memcg, true); |
1129 | } else { /* ksm created a completely new copy */ | ||
1130 | page_add_new_anon_rmap(page, vma, addr); | 1130 | page_add_new_anon_rmap(page, vma, addr); |
1131 | mem_cgroup_commit_charge_swapin(page, memcg); | 1131 | mem_cgroup_commit_charge(page, memcg, false); |
1132 | lru_cache_add_active_or_unevictable(page, vma); | ||
1133 | } | ||
1132 | swap_free(entry); | 1134 | swap_free(entry); |
1133 | /* | 1135 | /* |
1134 | * Move the page to the active list so it is not | 1136 | * Move the page to the active list so it is not |