2022-12-15 10:27:59

by Haifeng Xu

[permalink] [raw]
Subject: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm

The memory events aren't supported on root cgroup, so there is no need
to account MEMCG_OOM_KILL on root memcg.

Signed-off-by: Haifeng Xu <[email protected]>
---
include/linux/memcontrol.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 567f12323f55..09f75161a3bc 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -1142,7 +1142,7 @@ static inline void memcg_memory_event_mm(struct mm_struct *mm,

rcu_read_lock();
memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
- if (likely(memcg))
+ if (likely(memcg && !mem_cgroup_is_root(memcg)))
memcg_memory_event(memcg, event);
rcu_read_unlock();
}
--
2.25.1


2022-12-15 18:44:13

by Shakeel Butt

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm

On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
> The memory events aren't supported on root cgroup, so there is no need
> to account MEMCG_OOM_KILL on root memcg.
>

Can you explain the scenario where this is happening and causing issue
for you?

> Signed-off-by: Haifeng Xu <[email protected]>
> ---
> include/linux/memcontrol.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
> index 567f12323f55..09f75161a3bc 100644
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -1142,7 +1142,7 @@ static inline void memcg_memory_event_mm(struct mm_struct *mm,
>
> rcu_read_lock();
> memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
> - if (likely(memcg))
> + if (likely(memcg && !mem_cgroup_is_root(memcg)))

Even if we need this additional check, this is not the right place.

> memcg_memory_event(memcg, event);
> rcu_read_unlock();
> }
> --
> 2.25.1
>

2022-12-16 02:09:35

by Haifeng Xu

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm



On 2022/12/16 02:18, Shakeel Butt wrote:
> On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
>> The memory events aren't supported on root cgroup, so there is no need
>> to account MEMCG_OOM_KILL on root memcg.
>>
>
> Can you explain the scenario where this is happening and causing issue
> for you?
>
If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
does not count any memory event.

>> Signed-off-by: Haifeng Xu <[email protected]>
>> ---
>> include/linux/memcontrol.h | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
>> index 567f12323f55..09f75161a3bc 100644
>> --- a/include/linux/memcontrol.h
>> +++ b/include/linux/memcontrol.h
>> @@ -1142,7 +1142,7 @@ static inline void memcg_memory_event_mm(struct mm_struct *mm,
>>
>> rcu_read_lock();
>> memcg = mem_cgroup_from_task(rcu_dereference(mm->owner));
>> - if (likely(memcg))
>> + if (likely(memcg && !mem_cgroup_is_root(memcg)))
>
> Even if we need this additional check, this is not the right place.
>
>> memcg_memory_event(memcg, event);
>> rcu_read_unlock();
>> }
>> --
>> 2.25.1
>>

2022-12-16 06:57:36

by Shakeel Butt

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm

On Fri, Dec 16, 2022 at 09:43:02AM +0800, Haifeng Xu wrote:
>
>
> On 2022/12/16 02:18, Shakeel Butt wrote:
> > On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
> >> The memory events aren't supported on root cgroup, so there is no need
> >> to account MEMCG_OOM_KILL on root memcg.
> >>
> >
> > Can you explain the scenario where this is happening and causing issue
> > for you?
> >
> If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
> still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
> flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
> does not count any memory event.
>

What about v1's memory.oom_control?

2022-12-16 07:45:14

by Haifeng Xu

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm



On 2022/12/16 14:42, Shakeel Butt wrote:
> On Fri, Dec 16, 2022 at 09:43:02AM +0800, Haifeng Xu wrote:
>>
>>
>> On 2022/12/16 02:18, Shakeel Butt wrote:
>>> On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
>>>> The memory events aren't supported on root cgroup, so there is no need
>>>> to account MEMCG_OOM_KILL on root memcg.
>>>>
>>>
>>> Can you explain the scenario where this is happening and causing issue
>>> for you?
>>>
>> If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
>> still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
>> flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
>> does not count any memory event.
>>
>
> What about v1's memory.oom_control?
>

The memory.oom_control doesn't set the CFTYPE_NOT_ON_ROOT flag. But oom_kill_disable or
under_oom actually only support non-root memcg, so the memory_events should be consistent
with them.

2022-12-16 07:58:15

by Shakeel Butt

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm

On Fri, Dec 16, 2022 at 03:28:53PM +0800, Haifeng Xu wrote:
>
>
> On 2022/12/16 14:42, Shakeel Butt wrote:
> > On Fri, Dec 16, 2022 at 09:43:02AM +0800, Haifeng Xu wrote:
> >>
> >>
> >> On 2022/12/16 02:18, Shakeel Butt wrote:
> >>> On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
> >>>> The memory events aren't supported on root cgroup, so there is no need
> >>>> to account MEMCG_OOM_KILL on root memcg.
> >>>>
> >>>
> >>> Can you explain the scenario where this is happening and causing issue
> >>> for you?
> >>>
> >> If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
> >> still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
> >> flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
> >> does not count any memory event.
> >>
> >
> > What about v1's memory.oom_control?
> >
>
> The memory.oom_control doesn't set the CFTYPE_NOT_ON_ROOT flag. But oom_kill_disable or
> under_oom actually only support non-root memcg, so the memory_events should be consistent
> with them.

Did you take a look at mem_cgroup_oom_control_read()? It is displaying
MEMCG_OOM_KILL for root memcg. Irrespective it makes sense or not, you
want to change behavior of user visible interface. If you really want to
then propose for the deprecation of that interface.

2022-12-16 08:21:53

by Haifeng Xu

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm



On 2022/12/16 15:36, Shakeel Butt wrote:
> On Fri, Dec 16, 2022 at 03:28:53PM +0800, Haifeng Xu wrote:
>>
>>
>> On 2022/12/16 14:42, Shakeel Butt wrote:
>>> On Fri, Dec 16, 2022 at 09:43:02AM +0800, Haifeng Xu wrote:
>>>>
>>>>
>>>> On 2022/12/16 02:18, Shakeel Butt wrote:
>>>>> On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
>>>>>> The memory events aren't supported on root cgroup, so there is no need
>>>>>> to account MEMCG_OOM_KILL on root memcg.
>>>>>>
>>>>>
>>>>> Can you explain the scenario where this is happening and causing issue
>>>>> for you?
>>>>>
>>>> If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
>>>> still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
>>>> flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
>>>> does not count any memory event.
>>>>
>>>
>>> What about v1's memory.oom_control?
>>>
>>
>> The memory.oom_control doesn't set the CFTYPE_NOT_ON_ROOT flag. But oom_kill_disable or
>> under_oom actually only support non-root memcg, so the memory_events should be consistent
>> with them.
>
> Did you take a look at mem_cgroup_oom_control_read()? It is displaying
> MEMCG_OOM_KILL for root memcg. Irrespective it makes sense or not, you
> want to change behavior of user visible interface. If you really want to
> then propose for the deprecation of that interface.

Yes, I have see it in mem_cgroup_oom_control_read() and I think that
showing MEMCG_OOM_KILL for root memcg doesn't make much sense.

Shoud I add the CFTYPE_NOT_ON_ROOT flag for cgroup v1?

2022-12-16 08:34:21

by Shakeel Butt

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm

On Fri, Dec 16, 2022 at 03:50:49PM +0800, Haifeng Xu wrote:
>
>
> On 2022/12/16 15:36, Shakeel Butt wrote:
> > On Fri, Dec 16, 2022 at 03:28:53PM +0800, Haifeng Xu wrote:
> >>
> >>
> >> On 2022/12/16 14:42, Shakeel Butt wrote:
> >>> On Fri, Dec 16, 2022 at 09:43:02AM +0800, Haifeng Xu wrote:
> >>>>
> >>>>
> >>>> On 2022/12/16 02:18, Shakeel Butt wrote:
> >>>>> On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
> >>>>>> The memory events aren't supported on root cgroup, so there is no need
> >>>>>> to account MEMCG_OOM_KILL on root memcg.
> >>>>>>
> >>>>>
> >>>>> Can you explain the scenario where this is happening and causing issue
> >>>>> for you?
> >>>>>
> >>>> If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
> >>>> still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
> >>>> flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
> >>>> does not count any memory event.
> >>>>
> >>>
> >>> What about v1's memory.oom_control?
> >>>
> >>
> >> The memory.oom_control doesn't set the CFTYPE_NOT_ON_ROOT flag. But oom_kill_disable or
> >> under_oom actually only support non-root memcg, so the memory_events should be consistent
> >> with them.
> >
> > Did you take a look at mem_cgroup_oom_control_read()? It is displaying
> > MEMCG_OOM_KILL for root memcg. Irrespective it makes sense or not, you
> > want to change behavior of user visible interface. If you really want to
> > then propose for the deprecation of that interface.
>
> Yes, I have see it in mem_cgroup_oom_control_read() and I think that
> showing MEMCG_OOM_KILL for root memcg doesn't make much sense.
>

It doesn't matter as there might already be users using it.

> Shoud I add the CFTYPE_NOT_ON_ROOT flag for cgroup v1?
>

Before doing anything, I am still not seeing why we really need this
patch? What exactly is the issue this patch is trying to solve? To me
this patch is negatively impacting the readability of the code. Unless
you are seeing some real production issues, I don't think we need to add
any special casing for MEMCG_OOM_KILL here.

2022-12-16 09:40:27

by Haifeng Xu

[permalink] [raw]
Subject: Re: [PATCH] mm/memcontrol: Skip root memcg in memcg_memory_event_mm



On 2022/12/16 16:17, Shakeel Butt wrote:
> On Fri, Dec 16, 2022 at 03:50:49PM +0800, Haifeng Xu wrote:
>>
>>
>> On 2022/12/16 15:36, Shakeel Butt wrote:
>>> On Fri, Dec 16, 2022 at 03:28:53PM +0800, Haifeng Xu wrote:
>>>>
>>>>
>>>> On 2022/12/16 14:42, Shakeel Butt wrote:
>>>>> On Fri, Dec 16, 2022 at 09:43:02AM +0800, Haifeng Xu wrote:
>>>>>>
>>>>>>
>>>>>> On 2022/12/16 02:18, Shakeel Butt wrote:
>>>>>>> On Thu, Dec 15, 2022 at 09:19:07AM +0000, Haifeng Xu wrote:
>>>>>>>> The memory events aren't supported on root cgroup, so there is no need
>>>>>>>> to account MEMCG_OOM_KILL on root memcg.
>>>>>>>>
>>>>>>>
>>>>>>> Can you explain the scenario where this is happening and causing issue
>>>>>>> for you?
>>>>>>>
>>>>>> If the victim selected by oom killer belongs to root memcg, memcg_memory_event_mm
>>>>>> still counts the MEMCG_OOM_KILL event. This behavior is meaningless because the
>>>>>> flag of events/events.local in memory_files is CFTYPE_NOT_ON_ROOT. The root memcg
>>>>>> does not count any memory event.
>>>>>>
>>>>>
>>>>> What about v1's memory.oom_control?
>>>>>
>>>>
>>>> The memory.oom_control doesn't set the CFTYPE_NOT_ON_ROOT flag. But oom_kill_disable or
>>>> under_oom actually only support non-root memcg, so the memory_events should be consistent
>>>> with them.
>>>
>>> Did you take a look at mem_cgroup_oom_control_read()? It is displaying
>>> MEMCG_OOM_KILL for root memcg. Irrespective it makes sense or not, you
>>> want to change behavior of user visible interface. If you really want to
>>> then propose for the deprecation of that interface.
>>
>> Yes, I have see it in mem_cgroup_oom_control_read() and I think that
>> showing MEMCG_OOM_KILL for root memcg doesn't make much sense.
>>
>
> It doesn't matter as there might already be users using it.
>
>> Shoud I add the CFTYPE_NOT_ON_ROOT flag for cgroup v1?
>>
>
> Before doing anything, I am still not seeing why we really need this
> patch? What exactly is the issue this patch is trying to solve? To me
> this patch is negatively impacting the readability of the code. Unless
> you are seeing some real production issues, I don't think we need to add
> any special casing for MEMCG_OOM_KILL here.

As we can see in memcg_memory_event(), memory event never be count in root
memcg. Passing the root memcg to it seems somewhat self-contradictory. Also,
cgroup v2 doesn't need this.