On Thu, Apr 28, 2022 at 01:16:53AM +0300, Vasily Averin wrote: > On 4/27/22 18:06, Shakeel Butt wrote: > > On Wed, Apr 27, 2022 at 5:22 AM Michal Koutný <mkoutny@xxxxxxxx> wrote: > >> > >> On Tue, Apr 26, 2022 at 10:23:32PM -0700, Shakeel Butt <shakeelb@xxxxxxxxxx> wrote: > >>> [...] > >>>> > >>>> +static inline struct mem_cgroup *get_mem_cgroup_from_obj(void *p) > >>>> +{ > >>>> + struct mem_cgroup *memcg; > >>>> + > >>> > >>> Do we need memcg_kmem_enabled() check here or maybe > >>> mem_cgroup_from_obj() should be doing memcg_kmem_enabled() instead of > >>> mem_cgroup_disabled() as we can have "cgroup.memory=nokmem" boot > >>> param. > > Shakeel, unfortunately I'm not ready to answer this question right now. > I even did not noticed that memcg_kmem_enabled() and mem_cgroup_disabled() > have a different nature. > If you have no objections I'm going to keep this place as is and investigate > this question later. > > >> I reckon such a guard is on the charge side and readers should treat > >> NULL and root_mem_group equally. Or is there a case when these two are > >> different? > >> > >> (I can see it's different semantics when stored in current->active_memcg > >> (and active_memcg() getter) but for such "outer" callers like here it > >> seems equal.) > > Dear Michal, > I may have misunderstood your point of view, so let me explain my vision > in more detail. > I do not think that NULL and root_mem_cgroup are equal here: > - we have enabled cgroups and well-defined root_mem_cgroup, > - this function is called from inside memcg-limited container, > - we tried to get memcg from net, but without success, > and as result got NULL from mem_cgroup_from_obj() > (frankly speaking I do not think this situation is really possible) > If we keep memcg = NULL, then current's memcg will not be masked and > net_init's allocations will be accounted to current's memcg. > So we need to set active_memcg to root_mem_cgroup, it helps to avoid > incorrect accounting. It's way out of scope of this patch, but I think we need to stop using NULL as root_mem_cgroup/system scope indicator. Remaining use cases will be like end of cgroup iteration, active memcg not set, parent of the root memcg, etc. We can point root_mem_cgroup at a statically allocated structure on both CONFIG_MEMCG and !CONFIG_MEMCG. Does it sound reasonable or I'm missing some important points? Thanks!