Re: [PATCH v3 1/2] mm/vmpressure: skip tree=true accounting on cgroup v2

From: Usama Arif

Date: Tue Jun 30 2026 - 12:31:49 EST




On 30/06/2026 17:07, Johannes Weiner wrote:
> On Tue, Jun 30, 2026 at 04:23:32AM -0700, Usama Arif wrote:
>> vmpressure() has two outputs gated by the @tree argument:
>>
>> @tree=false drives in-kernel socket pressure (mem_cgroup_set_
>> socket_pressure), consumed by TCP/SCTP. This only
>> applies on cgroup v2; on v1 socket memory is charged
>> separately via tcpmem and the consumer reads
>> memcg->tcpmem_pressure instead.
>>
>> @tree=true drives userspace eventfd notifications via the v1
>> memory.pressure_level / cgroup.event_control interface.
>> v2 has no equivalent: userspace gets reclaim signals
>> through memory.pressure (PSI), which does not touch
>> vmpressure.
>>
>> The existing early return covered v1 + @tree=false. The symmetric
>> v2 + @tree=true case was falling through and doing the full lock /
>> accumulate / schedule_work / parent-walk dance for an events list
>> that can never be populated. bpftrace on a 176-core production host
>> (cgroup v2, CONFIG_MEMCG_V1=n, 285 memcgs, sustained reclaim) showed
>> ~16,200 @tree=true vmpressure() calls per minute. Add an early return
>> that skips cgroup v2 + tree = true which avoids us doing all this work.
>> On a v2-only host this also eliminates a lock contention path that can
>> serialise reclaimers on a single global sr_lock.
>>
>> Acked-by: Shakeel Butt <shakeel.butt@xxxxxxxxx>
>> Signed-off-by: Usama Arif <usama.arif@xxxxxxxxx>
>> ---
>> mm/vmpressure.c | 10 ++++++----
>> 1 file changed, 6 insertions(+), 4 deletions(-)
>>
>> diff --git a/mm/vmpressure.c b/mm/vmpressure.c
>> index f053554e5826..c82cee1ab43b 100644
>> --- a/mm/vmpressure.c
>> +++ b/mm/vmpressure.c
>> @@ -246,11 +246,13 @@ void vmpressure(gfp_t gfp, int order, struct mem_cgroup *memcg, bool tree,
>> return;
>>
>> /*
>> - * The in-kernel users only care about the reclaim efficiency
>> - * for this @memcg rather than the whole subtree, and there
>> - * isn't and won't be any in-kernel user in a legacy cgroup.
>> + * Only two combinations have a consumer:
>> + * cgroup v2 + tree=false -> in-kernel socket pressure
>> + * cgroup v1 + tree=true -> userspace eventfds (memory.pressure_level)
>> + * Skip the other two: nothing consumes the result.
>> */
>> - if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && !tree)
>> + if ((!cgroup_subsys_on_dfl(memory_cgrp_subsys) && !tree) ||
>> + (cgroup_subsys_on_dfl(memory_cgrp_subsys) && tree))
>> return;
>
> I had already acked this one, with a half serious suggestion to make
> this
>
> if (cgroup_subsys_on_dfl(memory_cgrp_subsys) == tree)
> return;
>
> Anyway, no strong feelings. If nobody agrees,
>
> Acked-by: Johannes Weiner <hannes@xxxxxxxxxxx>

Yeah sorry about this! I just amended my last patch to move code
from vmpressure-v1.c to memcontrol-v1.c and just sent it, without
other changes. Forgot Shakeels ack on v2 as well :(

Andrew would you mind applying the below fixlet? I can also respin
if its easier. Thanks!!