On 3/7/23 07:56, Qi Zheng wrote: > For now, reparent_shrinker_deferred() is the only holder > of read lock of shrinker_rwsem. And it already holds the > global cgroup_mutex, so it will not be called in parallel. > > Therefore, in order to convert shrinker_rwsem to shrinker_mutex > later, here we change to hold the write lock of shrinker_rwsem > to reparent. > > Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/vmscan.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 9a5a3da5c8b5..7aaf6f94ac1b 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -451,7 +451,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) > parent = root_mem_cgroup; > > /* Prevent from concurrent shrinker_info expand */ > - down_read(&shrinker_rwsem); > + down_write(&shrinker_rwsem); > for_each_node(nid) { > child_info = shrinker_info_protected(memcg, nid); > parent_info = shrinker_info_protected(parent, nid); > @@ -460,7 +460,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) > atomic_long_add(nr, &parent_info->nr_deferred[i]); > } > } > - up_read(&shrinker_rwsem); > + up_write(&shrinker_rwsem); > } > > static bool cgroup_reclaim(struct scan_control *sc)