From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=95.215.58.51 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793092357; b=Rx2fuAGgIBmhGVZYzaG3aO6CgK5jUYtIQrhsM/HuTiyd+pIpbHJDdeUjfAcE9Pe5E+3g B0ld34Bzmb1RLeSdRZdkYyH500isjgAvs+5EdKTPVuBUmJngXPQfxc6XZAo79HlUHE7sC 8z1ZfHp8rEBRqkF8OvW9XsK13DjIBRDeQhfW3UunwoOaqAquCaT3FKgMri06x/QeyTQLj T+FNwrA9vCqon1cei9PiVdIvFpHdg6GMFtDC0EPimQEdAXA6keL0To7AEOLo5k9LUm+AI O2h7h/HIOFtiOgBNGN6z7kMtZPOdXqrlt0CzY8EL6J5A4dEALU0BZYWHj04cf3fmi1w== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793092357; h=DMARC-Filter:X-Envelope-To:DKIM-Signature:X-Envelope-To:Received: X-Mizu-Trace-ID:X-Migadu-Flow:From:To:Cc:Subject:Date:Message-ID: X-Mailer:MIME-Version:Content-Transfer-Encoding; bh=Ndi2448wVUZuF68kqWF0v2z9NaMIBNKc9nVCJQzYI1k=; b=rjaRb46qEYOXDAZ9X/i1VoJZe1Gcn/TRuyDy0c9WWnpvb3Myk5UinkLh23PBLp/qiFwS y54DxBdmbvGUohsS1ZcEcQmXzWMoY20SYlWRK5AhlCoW4DeJedg9J1aoQL/m470mW+qru dpRSQyRrhQ8WsM2xGzehzYR6D8Heam3FWpf/4h5k59VTdY9QKLo7Dg7l2/UR6z1Py8UNM 2aT5iwjvS2SOcuNw/Fl5d38zutYWk4BPtwov3EYHljrJxxU+xLEzR5XE0eFUuTSi4co3V M7dsLlqBon3Q4szDG/r9IXiS5zAeE+3+78L8QigQ5VSwPaD+kzlwPxjkC7d2Y+ml3iA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.remote-ip=95.215.58.51 Received: from mta1.migadu.com (out-51.mta1.migadu.com [95.215.58.51]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 207C5606A31A for ; Tue, 27 Oct 2026 09:12:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 207C5606A31A Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Envelope-To: bpf@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=Iy2EZRXCQMOBxljPF+GT6qR9TSW/M2vcb/khwUxJInc=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1793092348; v=1; x=1793697148; b=bA2/gm+InVPxrA8/cUeuKfkv9tlw8WkJfCJkOBEDJtQCHB0HWSave9Iz76npyrcxJMqpPc1t uCc6jbvmBvAjzUUwt9MB4DHn/lLKKxWsS6jwJ3eh4ZlxhovExca29l8pVbWHLXsWABOthurUun7 yDoOp3aXMoQ0FUfbTaxkhPds= X-Envelope-To: bpf@vger.kernel.org Received: by mta11.migadu.com with ESMTPS id e68cbb451e1e33a5; Tue, 27 Oct 2026 09:12:27 +0000 X-Mizu-Trace-ID: e68cbb451e1e33a5 X-Migadu-Flow: FLOW_OUT From: Hui Zhu To: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Kumar Kartikeya Dwivedi , Song Liu , Yonghong Song , Jiri Olsa , Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , JP Kobryn , Andrew Morton , Shuah Khan , davem@davemloft.net, Jakub Kicinski , Jesper Dangaard Brouer , Stanislav Fomichev , KP Singh , Tao Chen , Mykyta Yatsenko , Leon Hwang , Anton Protopopov , Amery Hung , Tobias Klauser , Eyal Birger , Rong Tao , Hao Luo , Peter Zijlstra , Miguel Ojeda , Nathan Chancellor , Kees Cook , Tejun Heo , Jeff Xu , mkoutny@suse.com, Jan Hendrik Farr , Christian Brauner , Randy Dunlap , Brian Gerst , Masahiro Yamada , Willem de Bruijn , Jason Xing , Paul Chaignon , Lance Yang , Jiayuan Chen , Emil Tsalapatis , Ihor Solodrai , Barry Song , Geliang Tang , linux-kernel@vger.kernel.org, bpf@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Hui Zhu Subject: [RFC PATCH 0/2] memcg_ext: dynamic memory.low and memory.min protection Date: Tue, 27 Oct 2026 17:11:58 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 X-Mailing-List: bpf@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Hui Zhu 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@linux.dev/ [2] https://lore.kernel.org/all/cover.1779760876.git.zhuhui@kylinos.cn/ [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