On Tue, Dec 20, 2022 at 10:27:45AM -0800, Roman Gushchin wrote: > To charge a freshly allocated kernel object to a memory cgroup, the > kernel needs to obtain an objcg pointer. Currently it does it > indirectly by obtaining the memcg pointer first and then calling to > __get_obj_cgroup_from_memcg(). > > Usually tasks spend their entire life belonging to the same object > cgroup. So it makes sense to save the objcg pointer on task_struct > directly, so it can be obtained faster. It requires some work on fork, > exit and cgroup migrate paths, but these paths are way colder. > > The old indirect way is still used for remote memcg charging. > > Signed-off-by: Roman Gushchin <roman.gushchin@xxxxxxxxx> This looks good too. Few comments below: [...] > + > +#ifdef CONFIG_MEMCG_KMEM > +static void mem_cgroup_kmem_attach(struct cgroup_taskset *tset) > +{ > + struct task_struct *task; > + struct cgroup_subsys_state *css; > + > + cgroup_taskset_for_each(task, css, tset) { > + struct mem_cgroup *memcg; > + > + if (task->objcg) > + obj_cgroup_put(task->objcg); > + > + rcu_read_lock(); > + memcg = container_of(css, struct mem_cgroup, css); > + task->objcg = __get_obj_cgroup_from_memcg(memcg); > + rcu_read_unlock(); > + } > +} > +#else > +static void mem_cgroup_kmem_attach(struct cgroup_taskset *tset) {} > +#endif /* CONFIG_MEMCG_KMEM */ > + > +#if defined(CONFIG_MEMCG_KMEM) || defined(CONFIG_MEMCG_KMEM) I think you want CONFIG_LRU_GEN in the above check. > static void mem_cgroup_attach(struct cgroup_taskset *tset) > { > + mem_cgroup_lru_gen_attach(tset); > + mem_cgroup_kmem_attach(tset); > } > -#endif /* CONFIG_LRU_GEN */ > +#endif > > static int seq_puts_memcg_tunable(struct seq_file *m, unsigned long value) > { > @@ -6816,9 +6872,15 @@ struct cgroup_subsys memory_cgrp_subsys = { > .css_reset = mem_cgroup_css_reset, > .css_rstat_flush = mem_cgroup_css_rstat_flush, > .can_attach = mem_cgroup_can_attach, > +#if defined(CONFIG_MEMCG_KMEM) || defined(CONFIG_MEMCG_KMEM) Same here. > .attach = mem_cgroup_attach, > +#endif > .cancel_attach = mem_cgroup_cancel_attach, > .post_attach = mem_cgroup_move_task, > +#ifdef CONFIG_MEMCG_KMEM > + .fork = mem_cgroup_fork, > + .exit = mem_cgroup_exit, > +#endif > .dfl_cftypes = memory_files, > .legacy_cftypes = mem_cgroup_legacy_files, > .early_init = 0, > -- > 2.39.0 >