Re: [PATCH memcg v4] net: set proper memcg for net_init hooks allocations
From: Roman Gushchin <roman.gushchin@linux.dev>
Date: 2022-04-27 22:36:22
Also in:
cgroups, lkml
On Thu, Apr 28, 2022 at 01:16:53AM +0300, Vasily Averin wrote:
On 4/27/22 18:06, Shakeel Butt wrote:quoted
On Wed, Apr 27, 2022 at 5:22 AM Michal Koutný [off-list ref] wrote:quoted
On Tue, Apr 26, 2022 at 10:23:32PM -0700, Shakeel Butt [off-list ref] wrote:quoted
[...]quoted
+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.quoted
quoted
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!