From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=91.218.175.174 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793092357; b=pvyUAg4BSU29xoylbSY1JZqUFIjPAqOcoz0WIirWLaVcV4IX54lHYGRgH1YesDvW/a3B R3KWDq3n0amW8nov9lXCwDFRTr/jAfZ6bNJlpgOVBRStgIn/SmdGRn7v6m6WrpRcYBzPS 7Xd7q7R3IzBUGvBRKXQCPIk9nUKtUMpULvwF96tpmf9mYqSyFE6wvPStUFlta1qRlsg/O QQsejxEAHTP5VXOBQ01hQbAQleclJd0lNagbtmXpv+T9e5EjNiRCBvRryP4ocWbK9nHsO pNucmuK6nfpTEtIx34KGgaTYLzHd84tJuhC7gT/AP4kXfVntwRMOlhiPeKSTau8piog== 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=ZxlHPFXavD+XBlbjPPD3v8dCnfdcvxFzR7Pm3Gh0syG/FYPbomndENR9lccSL7JEi7uo 6LWgmpEXthb2TAOUMRrHvnTmeOyxDndUwSHDLyFCFFHg2IYgPL/RWuFjvDVVhgF+og4Mv suB4O6JL7+z5Z/4pu+acg/w/KbuElWFc4cJafCGYvw2dvgDtXpKT0Wj4Cr/ZCMY5X/jOL 80cWw7E7ytOBAC9PieIls83tdZ0NJpTWSdb6xE0V19yXywGE1cnHl+mfc2bnLvupgYFPk JVswZQMRs4ztVDMvT3Gze30vTEqfdOAjUjktei/oFW0ZXo6L4noL2O8KH4gzZLPb8sA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass header.d=linux.dev header.i=@linux.dev header.a=rsa-sha256 header.s=key1 header.b="bA2/gm+I"; arc=none smtp.remote-ip=91.218.175.174 Received: from mta0.migadu.com (out-174.mta0.migadu.com [91.218.175.174]) (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 2BCF9606A31E for ; Tue, 27 Oct 2026 09:12:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 2BCF9606A31E 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=linux.dev header.i=@linux.dev header.a=rsa-sha256 header.s=key1 header.b=bA2/gm+I X-Envelope-To: netdev@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: netdev@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: netdev@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