[RFC PATCH 0/2] memcg_ext: dynamic memory.low and memory.min protection
From: Hui Zhu
Date: Tue Oct 27 2026 - 05:12:45 EST
From: Hui Zhu <zhuhui@xxxxxxxxxx>
This follows the memcg_ext RFC [1], which adds bpf_memcg_ops - a
struct_ops type attaching memory controller policy to a cgroup - and
one member, high_policy(). Its cover letter names dynamic protection
as future work; these two patches are that.
Why it matters: memory.low and memory.min protect a cgroup by a fixed
threshold and have no idea whether it is using the memory. A
high-priority cgroup that holds a large working set and then goes idle
keeps suppressing reclaim on its siblings, and that memory is wasted.
A policy program sees the real activity - page faults, charges - and
can grant or withdraw protection as it changes.
The hooks are not new: [2] proposed the same below-low and below-min
decision on its own memcg_bpf_ops type. Only the carrier changes
here. bpf_memcg_ops already supplies attach, the ancestor walk,
result combination and the re-entry guard, so protection costs two
members and one walk helper shared with high_policy().
Patch 1 adds low_policy() and min_policy(). A program gets a
read-only snapshot of the check the kernel is making - the memcg, the
reclaim target, the threshold and the usage - and returns a request;
BPF_MEMCG_PROT_BELOW, the only one so far, treats the cgroup as below
its threshold, so reclaim skips it and counts it in memory.events.
The kernel compares elow/emin first and asks BPF only when it found
the cgroup unprotected, and ORs the answers of the cgroup and every
ancestor, so a policy can only add protection, never take it away.
Patch 2 is the prog_tests runner: attach both policies to a child,
fault 8M of anonymous memory into it, reclaim from its parent, and
check that both hooks were consulted and that the ctx described the
check faithfully. Both answer NO_OPINION, so nothing about reclaim's
outcome is asserted. A working example that does answer BELOW, so
reclaim skips one cgroup and takes the memory from a sibling instead,
is maintained out of tree at [3], released under GPLv2.
[1] https://lore.kernel.org/all/20260921192559.2619635-1-shakeel.butt@xxxxxxxxx/
[2] https://lore.kernel.org/all/cover.1779760876.git.zhuhui@xxxxxxxxxx/
[3] https://github.com/teawater/memcg-async-reclaim/tree/memcg_ext_plus
Hui Zhu (2):
memcg_ext: add memory.low and memory.min protection policies
selftests/bpf: Add bpf_memcg_ops protection test
include/linux/bpf_memcontrol.h | 104 ++++++++++-
include/linux/memcontrol.h | 23 ++-
mm/bpf_memcontrol.c | 162 ++++++++++++++----
.../bpf/prog_tests/memcg_ops_protection.c | 151 ++++++++++++++++
.../bpf/progs/memcg_ops_protection.c | 72 ++++++++
5 files changed, 470 insertions(+), 42 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/memcg_ops_protection.c
create mode 100644 tools/testing/selftests/bpf/progs/memcg_ops_protection.c
--
2.43.0