Commit bdf4f4d2161a795b9323855a81a047bd68f16202
Committed by
Linus Torvalds
1 parent
90deb78839
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
mm: memcg: only check anon swapin page charges for swap cache
shmem knows for sure that the page is in swap cache when attempting to charge a page, because the cache charge entry function has a check for it. Only anon pages may be removed from swap cache already when trying to charge their swapin. Adjust the comment, though: '4969c11 mm: fix swapin race condition' added a stable PageSwapCache check under the page lock in the do_swap_page() before calling the memory controller, so it's unuse_pte()'s pte_same() that may fail. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Acked-by: Michal Hocko <mhocko@suse.cz> Cc: David Rientjes <rientjes@google.com> Cc: Hugh Dickins <hughd@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Wanpeng Li <liwp.linux@gmail.com> Cc: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 14 additions and 8 deletions Side-by-side Diff
mm/memcontrol.c
... | ... | @@ -2818,14 +2818,6 @@ |
2818 | 2818 | return 0; |
2819 | 2819 | if (!do_swap_account) |
2820 | 2820 | goto charge_cur_mm; |
2821 | - /* | |
2822 | - * A racing thread's fault, or swapoff, may have already updated | |
2823 | - * the pte, and even removed page from swap cache: in those cases | |
2824 | - * do_swap_page()'s pte_same() test will fail; but there's also a | |
2825 | - * KSM case which does need to charge the page. | |
2826 | - */ | |
2827 | - if (!PageSwapCache(page)) | |
2828 | - goto charge_cur_mm; | |
2829 | 2821 | memcg = try_get_mem_cgroup_from_page(page); |
2830 | 2822 | if (!memcg) |
2831 | 2823 | goto charge_cur_mm; |
... | ... | @@ -2848,6 +2840,20 @@ |
2848 | 2840 | *memcgp = NULL; |
2849 | 2841 | if (mem_cgroup_disabled()) |
2850 | 2842 | return 0; |
2843 | + /* | |
2844 | + * A racing thread's fault, or swapoff, may have already | |
2845 | + * updated the pte, and even removed page from swap cache: in | |
2846 | + * those cases unuse_pte()'s pte_same() test will fail; but | |
2847 | + * there's also a KSM case which does need to charge the page. | |
2848 | + */ | |
2849 | + if (!PageSwapCache(page)) { | |
2850 | + int ret; | |
2851 | + | |
2852 | + ret = __mem_cgroup_try_charge(mm, gfp_mask, 1, memcgp, true); | |
2853 | + if (ret == -EINTR) | |
2854 | + ret = 0; | |
2855 | + return ret; | |
2856 | + } | |
2851 | 2857 | return __mem_cgroup_try_charge_swapin(mm, page, gfp_mask, memcgp); |
2852 | 2858 | } |
2853 | 2859 |