From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE85C43F4C2 for ; Fri, 7 Aug 2026 20:21:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786134064; cv=none; b=RnaDjo08IxbO+DEwwndKJ0CrIFswvfXK4EPfVnVBdS+D6Wo2UjTWnKdQ9WPCumr94aA0liRxAKKk4YbxO48TRFZHsd5HdlAB7CXOFTk06y8bUEDmpTfI+4GlICokGoSRbhthATa2DPKP+qAgKGECDavV0Tr0wWV648Nyd8Tadlk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786134064; c=relaxed/simple; bh=x6+zULnjVSGwKnGUnc1/UzJDwmZxjXg8KnI3HpUc3JI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m3ZllitqKG7Sm5Ysnz0EOGjEvzckHLjsYjLfvp5smJeFYfpLZEYc2faxHFRSX1Pq57Mw6jJa3DIh/ZxXCVFHyoRHk29SOfx1z9Vfm25LudowXgobn3MEyCDWjKAu2U6qfWorKED2jYJ1O7lIjJOc97K/UJl0/sU+BaiSJEMUvJE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=D0Y2G/E+; arc=none smtp.client-ip=209.85.210.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D0Y2G/E+" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-7eb64085c45so2957146a34.2 for ; Fri, 07 Aug 2026 13:21:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786134061; x=1786738861; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HwNwt7qn0Dj2QjnweBxCilOvMKex3+n+ntJRoPVYrE4=; b=D0Y2G/E+peOkW9difLI0B2hdOxQhXBum0CQfAU5NerFA7QrCfSs4+JUHybGD8PI3hx 8veDigyVuMn1Uu3q4VN6zCu72zVR0USFLNecNETtes/YY2sbWz9SN8ZlURH4fYeCPhmn KrnrEkFA80zfW5sQreM5DW26cG4/xs8W1YC659sq6fyMGR57apg70E8K7fS61ck+x80y j3qlPzekZj4NgSCKdLJY4nQ07fF53YoiFvdOJbZPZHQsampYJTZQObl7y3tbBjewqb9M Fz1dnzLal2Vja4UGC7xc+LWKi52qJ4QIPgN5PiFB6M8eiar2b5BCUb5QFa9VTZmo0Jhb b/Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786134061; x=1786738861; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=HwNwt7qn0Dj2QjnweBxCilOvMKex3+n+ntJRoPVYrE4=; b=TjZQ1jb3gUFS0YVuzrOpuhf50GXuxo2A9/tksno5Vwo75iEJHGapCqOM8/DCaAax/b GFUeIHub6/dFnA12FGaax4XRq8h/yDuKValLj43sJlC7QRZOzj3IfnC9hDit63HAQilD Hrm0I40GTi8vejUG82005L2g2NyWfoi0W7LiMLRKrUrdyCL6t+iHFFBOH+CGSwF4btDy QFw/WzXPggiQqVX3h44ysswYHWZmQfbVIA6J8qj47vZz3BgdlM8Cgetxe4D8rnvM6Gz1 uZu+Dqs6dxgtI7NGZuImJVC6mwARi8syWXMMeznPYGUVWgNZaclCrjffzQ5Rg6B5Z2Vr BESA== X-Forwarded-Encrypted: i=1; AHgh+RrqKn8n7gSNxW7g4N8TIcpXDik0CMwvDwZk/+kEdvWYvbWnAca68ef7Oh6JUc3+scvI76ZHDic6o9uMceI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz3XXA/eurQJf6lT8JUtpNRDrq0w/tW2LOBW7qyumMKUJh2kOvP UCvjBw+4u6NoMN1rRwR44dlSCYKNa6NOHnI39T5b1u6pGCf3wF8H0jUx X-Gm-Gg: AR+sD118mnLGY+cRwFEoM5hzFVACGPLXxO223Kvz/OMAe8vviZtAJsPyW0zFXL/EGvS GdEcpPPL14mLuXxUvLHXMwON6ooV3EcRZH2pgU46kP3vJNBdsEdR05iNuQfzMfia4T/Bl8UR9gZ 0LJswhUlPnw3gudQ6TD9Op4Zeta+QqMvWC7LJ4o2ldzd2dpbay2k8/4KCJDVDi1cMA8Yaun3R2D MTIYyvjh3L+FI2de5lwVVxrmMXD6CAtEvbKnSsItdKjrqr7D6qvIVKOju9qtDlZGTI2+KftVC8a fPkoT6Ho2V1AqFGjtQ5qeIvvOUFbVxGJH9Ik7ELRVk+pRmHEzcKYUCvvbi45dLXr5XKDpBTRLMP 5UYQJUS+mhmjgZIIC3/80C8WLiFuoOa0KceSrcCukrJgidpJe9um2Vlj8f0TRlN/9cE/9endtFe CunPmmMLLSKSLFLkIdDzIk5/frDkCj4wzpdl3ON/bWD/LBnt8YjL8e/dc3BW57kOg6j+NQRp6zQ pCD2oGCIOBLG4n0zzVT0Ut4tQM/ug== X-Received: by 2002:a05:6820:1791:b0:6ae:ab01:9199 with SMTP id 006d021491bc7-6b042266f4fmr1570536eaf.34.1786134061552; Fri, 07 Aug 2026 13:21:01 -0700 (PDT) Received: from localhost ([2a03:2880:10ff:25::]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6b02bc2631esm3229086eaf.4.2026.08.07.13.21.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 13:21:00 -0700 (PDT) From: Joshua Hahn To: Johannes Weiner , Gregory Price Cc: Alistair Popple , Andrew Morton , Axel Rasmussen , Barry Song , Ben Segall , Brendan Jackman , Byungchul Park , David Hildenbrand , David Rientjes , Dietmar Eggemann , "Harry Yoo (Oracle)" , Ingo Molnar , Juri Lelli , K Prateek Nayak , Kairui Song , "Liam R. Howlett" , Lorenzo Stoakes , Matthew Brost , Mel Gorman , Michal Hocko , Michal Hocko , Mike Rapoport , Muchun Song , Peter Zijlstra , Qi Zheng , Rakie Kim , Roman Gushchin , Shakeel Butt , Steven Rostedt , Suren Baghdasaryan , "T.J. Mercier" , Valentin Schneider , Vincent Guittot , Vlastimil Babka , Wei Xu , Ying Huang , Yosry Ahmed , Yuanchu Xie , Zi Yan , cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, kernel-team@meta.com Subject: [RFC PATCH v3 01/14] mm/memcontrol: Introduce cgroup.memory=tiered_limits boot parameter Date: Fri, 7 Aug 2026 13:20:44 -0700 Message-ID: <20260807202059.2620949-2-joshua.hahnjy@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260807202059.2620949-1-joshua.hahnjy@gmail.com> References: <20260807202059.2620949-1-joshua.hahnjy@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Introduce a "tiered_limits" option for the cgroup.memory= kernel commandline parameter to enable tier-proportional scaling and enforcing of the memory cgroup controller limits memory.{min, low, high}. Since mem_cgroup_tiered_limits() will become a hotpath in the later commits to gate charging, demotion, and promotion decisions, use a static key so that cgroups not using tier-aware-memcg limits has minimal overhead. Enable it by adding to the kernel command line: cgroup.memory=tiered_limits The option is boot-time only, since flipping the bit at runtime could leave charges uncharged in the future, or uncharges for folios that were never charged. This feature is incompatible with cgroup v1, and wil raise a single warning statement if a system booted with tiered limits mounts a legacy cgroup: [XXX] cgroup.memory=tiered_limits should not be enabled with cgroupv1 Signed-off-by: Joshua Hahn --- include/linux/memcontrol.h | 18 ++++++++++++++++++ mm/memcontrol.c | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 2118d5b33d051..dce03df7eae05 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -530,6 +530,19 @@ static inline bool mem_cgroup_disabled(void) return !cgroup_subsys_enabled(memory_cgrp_subsys); } +#ifdef CONFIG_NUMA +DECLARE_STATIC_KEY_FALSE(memcg_tiered_limits_key); +static inline bool mem_cgroup_tiered_limits(void) +{ + return static_branch_unlikely(&memcg_tiered_limits_key); +} +#else +static inline bool mem_cgroup_tiered_limits(void) +{ + return false; +} +#endif + static inline void mem_cgroup_protection(struct mem_cgroup *root, struct mem_cgroup *memcg, unsigned long *min, @@ -1083,6 +1096,11 @@ static inline bool mem_cgroup_disabled(void) return true; } +static inline bool mem_cgroup_tiered_limits(void) +{ + return false; +} + static inline void memcg_memory_event(struct mem_cgroup *memcg, enum memcg_memory_event event) { diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 29330f5f9d4eb..cefe33b5fd285 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -320,6 +320,13 @@ EXPORT_SYMBOL(memcg_kmem_online_key); DEFINE_STATIC_KEY_FALSE(memcg_bpf_enabled_key); EXPORT_SYMBOL(memcg_bpf_enabled_key); +#ifdef CONFIG_NUMA +DEFINE_STATIC_KEY_FALSE(memcg_tiered_limits_key); + +/* Tier-proportional scaling of memory controller limits enabled? */ +static bool cgroup_memory_tiered_limits __ro_after_init; +#endif + /** * get_mem_cgroup_css_from_folio - acquire a css of the memcg associated with a folio * @folio: folio of interest @@ -4202,6 +4209,9 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) struct mem_cgroup *memcg, *old_memcg; bool memcg_on_dfl = cgroup_subsys_on_dfl(memory_cgrp_subsys); + if (mem_cgroup_tiered_limits() && !memcg_on_dfl) + pr_warn_once("cgroup.memory=tiered_limits should not be enabled with cgroupv1\n"); + old_memcg = set_active_memcg(parent); memcg = mem_cgroup_alloc(parent); set_active_memcg(old_memcg); @@ -5584,6 +5594,10 @@ static int __init cgroup_memory(char *s) cgroup_memory_nokmem = true; if (!strcmp(token, "nobpf")) cgroup_memory_nobpf = true; +#ifdef CONFIG_NUMA + if (!strcmp(token, "tiered_limits")) + cgroup_memory_tiered_limits = true; +#endif } return 1; } @@ -5630,6 +5644,11 @@ int __init mem_cgroup_init(void) memcg_pn_cachep = KMEM_CACHE(mem_cgroup_per_node, SLAB_PANIC | SLAB_HWCACHE_ALIGN); +#ifdef CONFIG_NUMA + if (cgroup_memory_tiered_limits) + static_branch_enable(&memcg_tiered_limits_key); +#endif + return 0; } -- 2.53.0-Meta