Commit b3cabea3 authored by Qi Zheng's avatar Qi Zheng Committed by Andrew Morton

mm: vmscan: hold write lock to reparent shrinker nr_deferred

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.

Link: https://lkml.kernel.org/r/20230313112819.38938-7-zhengqi.arch@bytedance.comSigned-off-by: default avatarQi Zheng <zhengqi.arch@bytedance.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Acked-by: default avatarKirill Tkhai <tkhai@ya.ru>
Acked-by: default avatarRoman Gushchin <roman.gushchin@linux.dev>
Cc: Christian König <christian.koenig@amd.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Paul E. McKenney <paulmck@kernel.org>
Cc: Shakeel Butt <shakeelb@google.com>
Cc: Sultan Alsawaf <sultan@kerneltoast.com>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Cc: Yang Shi <shy828301@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 20cd1892
...@@ -445,7 +445,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) ...@@ -445,7 +445,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg)
parent = root_mem_cgroup; parent = root_mem_cgroup;
/* Prevent from concurrent shrinker_info expand */ /* Prevent from concurrent shrinker_info expand */
down_read(&shrinker_rwsem); down_write(&shrinker_rwsem);
for_each_node(nid) { for_each_node(nid) {
child_info = shrinker_info_protected(memcg, nid); child_info = shrinker_info_protected(memcg, nid);
parent_info = shrinker_info_protected(parent, nid); parent_info = shrinker_info_protected(parent, nid);
...@@ -454,7 +454,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg) ...@@ -454,7 +454,7 @@ void reparent_shrinker_deferred(struct mem_cgroup *memcg)
atomic_long_add(nr, &parent_info->nr_deferred[i]); 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) static bool cgroup_reclaim(struct scan_control *sc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment