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

From: Johannes Weiner

Date: Tue Jun 30 2026 - 12:14:52 EST


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>