On Wed, Jan 12, 2022 at 11:17:53AM +0100, Michal Hocko wrote: > On Tue 11-01-22 18:01:29, Yu Zhao wrote: > > On Mon, Jan 10, 2022 at 05:57:39PM +0100, Michal Hocko wrote: > > > On Tue 04-01-22 13:22:25, Yu Zhao wrote: > > > [...] > > > > +static void walk_mm(struct lruvec *lruvec, struct mm_struct *mm, struct lru_gen_mm_walk *walk) > > > > +{ > > > > + static const struct mm_walk_ops mm_walk_ops = { > > > > + .test_walk = should_skip_vma, > > > > + .p4d_entry = walk_pud_range, > > > > + }; > > > > + > > > > + int err; > > > > +#ifdef CONFIG_MEMCG > > > > + struct mem_cgroup *memcg = lruvec_memcg(lruvec); > > > > +#endif > > > > + > > > > + walk->next_addr = FIRST_USER_ADDRESS; > > > > + > > > > + do { > > > > + unsigned long start = walk->next_addr; > > > > + unsigned long end = mm->highest_vm_end; > > > > + > > > > + err = -EBUSY; > > > > + > > > > + rcu_read_lock(); > > > > +#ifdef CONFIG_MEMCG > > > > + if (memcg && atomic_read(&memcg->moving_account)) > > > > + goto contended; > > > > +#endif > > > > > > Why do you need to check for moving_account? > > > > This check, if succeeds, blocks memcg migration. > > OK, I can see that you rely on the RCU here for the synchronization. A > comment which mentions mem_cgroup_move_charge would be helpful for > clarity. Will do > Is there any reason you are not using folio_memcg_lock in the > pte walk instead? We have a particular lruvec (the first arg), hence a particular memcg to lock. But we don't have a particular page to lock.