On Sat, Apr 16, 2022 at 11:39 PM Vasily Averin <vvs@xxxxxxxxxx> wrote: > > __register_pernet_operations() executes init hook of registered > pernet_operation structure in all existing net namespaces. > > Typically, these hooks are called by a process associated with > the specified net namespace, and all __GFP_ACCOUNTING marked > allocation are accounted for corresponding container/memcg. > > However __register_pernet_operations() calls the hooks in the same > context, and as a result all marked allocations are accounted > to one memcg for all processed net namespaces. > > This patch adjusts active memcg for each net namespace and helps > to account memory allocated inside ops_init() into the proper memcg. > > Signed-off-by: Vasily Averin <vvs@xxxxxxxxxx> > --- > Dear Vlastimil, Roman, > I'm not sure that memcg is used correctly here, > is it perhaps some additional locking required? > --- > net/core/net_namespace.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c > index a5b5bb99c644..171c6e0b2337 100644 > --- a/net/core/net_namespace.c > +++ b/net/core/net_namespace.c > @@ -26,6 +26,7 @@ > #include <net/net_namespace.h> > #include <net/netns/generic.h> > > +#include <linux/sched/mm.h> > /* > * Our network namespace constructor/destructor lists > */ > @@ -1147,7 +1148,13 @@ static int __register_pernet_operations(struct list_head *list, > * setup_net() and cleanup_net() are not possible. > */ > for_each_net(net) { > + struct mem_cgroup *old, *memcg = NULL; > +#ifdef CONFIG_MEMCG > + memcg = (net == &init_net) ? root_mem_cgroup : mem_cgroup_from_obj(net); memcg from obj is unstable, so you need a reference on memcg. You can introduce get_mem_cgroup_from_kmem() which works for both MEMCG_DATA_OBJCGS and MEMCG_DATA_KMEM. For uncharged objects (like init_net) it should return NULL. > +#endif > + old = set_active_memcg(memcg); > error = ops_init(ops, net); > + set_active_memcg(old); > if (error) > goto out_undo; > list_add_tail(&net->exit_list, &net_exit_list); > -- > 2.31.1 >