On 1/28/21 12:33 AM, Yang Shi wrote: > The shrinker map management is not purely memcg specific, it is at the intersection > between memory cgroup and shrinkers. It's allocation and assignment of a structure, > and the only memcg bit is the map is being stored in a memcg structure. So move the > shrinker_maps handling code into vmscan.c for tighter integration with shrinker code, > and remove the "memcg_" prefix. There is no functional change. > > Signed-off-by: Yang Shi <shy828301@xxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> Nits below: > @@ -1581,10 +1581,10 @@ static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg) > return false; > } > > -extern int memcg_expand_shrinker_maps(int new_id); > - > -extern void memcg_set_shrinker_bit(struct mem_cgroup *memcg, > - int nid, int shrinker_id); > +extern int alloc_shrinker_maps(struct mem_cgroup *memcg); > +extern void free_shrinker_maps(struct mem_cgroup *memcg); > +extern void set_shrinker_bit(struct mem_cgroup *memcg, > + int nid, int shrinker_id); "extern" is unnecessary and people seem to be removing them nowadays when touching the code > /* > * We allow subsystems to populate their shrinker-related > * LRU lists before register_shrinker_prepared() is called > @@ -212,7 +338,7 @@ static int prealloc_memcg_shrinker(struct shrinker *shrinker) > goto unlock; > > if (id >= shrinker_nr_max) { > - if (memcg_expand_shrinker_maps(id)) { > + if (expand_shrinker_maps(id)) { > idr_remove(&shrinker_idr, id); > goto unlock; > } > @@ -601,7 +727,7 @@ static unsigned long shrink_slab_memcg(gfp_t gfp_mask, int nid, Above this is a comment about barriers in memcg_set_shrinker_bit() that should be updated. > if (ret == SHRINK_EMPTY) > ret = 0; > else > - memcg_set_shrinker_bit(memcg, nid, i); > + set_shrinker_bit(memcg, nid, i); > } > freed += ret; > >