On 21.03.2018 17:56, Matthew Wilcox wrote: > On Wed, Mar 21, 2018 at 04:21:40PM +0300, Kirill Tkhai wrote: >> +++ b/include/linux/memcontrol.h >> @@ -151,6 +151,11 @@ struct mem_cgroup_thresholds { >> struct mem_cgroup_threshold_ary *spare; >> }; >> >> +struct shrinkers_map { >> + struct rcu_head rcu; >> + unsigned long *map[0]; >> +}; >> + >> enum memcg_kmem_state { >> KMEM_NONE, >> KMEM_ALLOCATED, >> @@ -182,6 +187,9 @@ struct mem_cgroup { >> unsigned long low; >> unsigned long high; >> >> + /* Bitmap of shrinker ids suitable to call for this memcg */ >> + struct shrinkers_map __rcu *shrinkers_map; >> + >> /* Range enforcement for interrupt charges */ >> struct work_struct high_work; >> > > Why use your own bitmap here? Why not use an IDA which can grow and > shrink automatically without you needing to play fun games with RCU?
Bitmap allows to use unlocked set_bit()/clear_bit() to maintain the map of not empty shrinkers. So, the reason to use IDR here is to save bitmap memory? Does this mean IDA works fast with sparse identifiers? It seems they require per-memcg lock to call IDR primitives. I just don't have information about this. If so, which IDA primitive can be used to set particular id in bitmap? There is idr_alloc_cyclic(idr, NULL, id, id+1, GFP_KERNEL) only I see to do that. Kirill