On Thu 05-07-12 02:45:03, Johannes Weiner wrote: > 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@xxxxxxxxxxx> Looks good Acked-by: Michal Hocko <mhocko@xxxxxxx> > --- > mm/memcontrol.c | 22 ++++++++++++++-------- > 1 files changed, 14 insertions(+), 8 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index d3701cd..9b7e256 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -2751,14 +2751,6 @@ static int __mem_cgroup_try_charge_swapin(struct mm_struct *mm, > return 0; > if (!do_swap_account) > goto charge_cur_mm; > - /* > - * A racing thread's fault, or swapoff, may have already updated > - * the pte, and even removed page from swap cache: in those cases > - * do_swap_page()'s pte_same() test will fail; but there's also a > - * KSM case which does need to charge the page. > - */ > - if (!PageSwapCache(page)) > - goto charge_cur_mm; > memcg = try_get_mem_cgroup_from_page(page); > if (!memcg) > goto charge_cur_mm; > @@ -2781,6 +2773,20 @@ int mem_cgroup_try_charge_swapin(struct mm_struct *mm, struct page *page, > *memcgp = NULL; > if (mem_cgroup_disabled()) > return 0; > + /* > + * A racing thread's fault, or swapoff, may have already > + * updated the pte, and even removed page from swap cache: in > + * those cases unuse_pte()'s pte_same() test will fail; but > + * there's also a KSM case which does need to charge the page. > + */ > + if (!PageSwapCache(page)) { > + int ret; > + > + ret = __mem_cgroup_try_charge(mm, gfp_mask, 1, memcgp, true); > + if (ret == -EINTR) > + ret = 0; > + return ret; > + } > return __mem_cgroup_try_charge_swapin(mm, page, gfp_mask, memcgp); > } > > -- > 1.7.7.6 > -- Michal Hocko SUSE Labs SUSE LINUX s.r.o. Lihovarska 1060/12 190 00 Praha 9 Czech Republic -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>