Thread (32 messages) 32 messages, 9 authors, 2022-05-30

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!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help