On 10/17/23 00:18, Roman Gushchin wrote: > Keep a reference to the original objcg object for the entire life > of a memcg structure. > > This allows to simplify the synchronization on the kernel memory > allocation paths: pinning a (live) memcg will also pin the > corresponding objcg. > > The memory overhead of this change is minimal because object cgroups > usually outlive their corresponding memory cgroups even without this > change, so it's only an additional pointer per memcg. > > Signed-off-by: Roman Gushchin (Cruise) <roman.gushchin@xxxxxxxxx> > Tested-by: Naresh Kamboju <naresh.kamboju@xxxxxxxxxx> > Acked-by: Shakeel Butt <shakeelb@xxxxxxxxxx> Forgot to point out typo: > --- > include/linux/memcontrol.h | 8 +++++++- > mm/memcontrol.c | 5 +++++ > 2 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > index ab94ad4597d0..277690af383d 100644 > --- a/include/linux/memcontrol.h > +++ b/include/linux/memcontrol.h > @@ -299,7 +299,13 @@ struct mem_cgroup { > > #ifdef CONFIG_MEMCG_KMEM > int kmemcg_id; > - struct obj_cgroup __rcu *objcg; > + /* > + * memcg->objcg is wiped out as a part of the objcg repaprenting reparenting ^ > + * process. memcg->orig_objcg preserves a pointer (and a reference) > + * to the original objcg until the end of live of memcg. > + */ > + struct obj_cgroup __rcu *objcg; > + struct obj_cgroup *orig_objcg; > /* list of inherited objcgs, protected by objcg_lock */ > struct list_head objcg_list; > #endif > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 0605e45bd4a2..d90cc19e4113 100644