Hi Michal, Thank you for reviewing this patchset! On Wed, Aug 14, 2024 at 5:00 AM Michal Koutný <mkoutny@xxxxxxxx> wrote: > > On Tue, Aug 13, 2024 at 08:47:12PM GMT, Kinsey Ho <kinseyho@xxxxxxxxxx> wrote: > > To obtain the pointer to the next memcg position, mem_cgroup_iter() > > currently holds css->refcnt during memcg traversal only to put > > css->refcnt at the end of the routine. This isn't necessary as an > > rcu_read_lock is already held throughout the function. The use of > > the RCU read lock with css_next_descendant_pre() guarantees that > > sibling linkage is safe without holding a ref on the passed-in @css. > > > > Remove css->refcnt usage during traversal by leveraging RCU. > > > > Signed-off-by: Kinsey Ho <kinseyho@xxxxxxxxxx> > > --- > > include/linux/memcontrol.h | 2 +- > > mm/memcontrol.c | 18 +----------------- > > 2 files changed, 2 insertions(+), 18 deletions(-) > > > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > > index 90ecd2dbca06..1aaed2f1f6ae 100644 > > --- a/include/linux/memcontrol.h > > +++ b/include/linux/memcontrol.h > > @@ -75,7 +75,7 @@ struct lruvec_stats_percpu; > > struct lruvec_stats; > > > > struct mem_cgroup_reclaim_iter { > > - struct mem_cgroup *position; > > + struct mem_cgroup __rcu *position; > > I'm not sure about this annotation. > This pointer could be modified concurrently with RCU read sections with > the cmpxchg which would assume that's equivalent with > rcu_assign_pointer(). (Which it might be but it's not idiomatic, so it > causes some head wrapping.) > Isn't this situation covered with a regular pointer and > READ_ONCE()+cmpxchg? Yes, that's a good point – this situation is covered with a regular pointer and READ_ONCE() + cmpxchg(). I'll make the change to remove the __rcu tag and replace rcu_dereference() with READ_ONCE() and send it out in v3. (This also rids of the sparse errors seen in v1) Thanks for pointing this out. Best, Kinsey