From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ot1-f47.google.com (mail-ot1-f47.google.com [209.85.210.47]) (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 A7AF922F74A for ; Fri, 10 Apr 2026 21:07:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775855279; cv=none; b=ZC27+pgZ6veaI2iE80fFq7sy/4rp6tq9VAArQ0NyC9v+fs6D4HoJDvGvlFNELS0kMasA0pAXJJtc+lDZvDPUtMdOYQalHUy6tXA+lsorBRbJiMcQ7DSBO6fx6Xoyv6slCuGlbCAwIDoByb7eKnoBrmET3AnVbSU1IDIXBmtn9Jc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775855279; c=relaxed/simple; bh=vs3QDWwNH10RCc4zFoNuAaKqRY15PIf14IbBQYxdpfE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gui6XhuPEBnBYGyLe5yHlNByE7h3K/XD+0B7mDKE2GHr/6I0EtXzWUkdogsXsdcCnHaMYs7p/ulKTaB2PJ1vWeuJ7QFqU+3NDNtj+2ZaEJC3H/NniJtBKu6xgEKTlw5wsvZw4b46NKa1lkS5mRRuOOJivwajv3W30sDg/o55yZE= 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=mTZbeYOG; arc=none smtp.client-ip=209.85.210.47 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="mTZbeYOG" Received: by mail-ot1-f47.google.com with SMTP id 46e09a7af769-7dbccb6ae20so1215453a34.3 for ; Fri, 10 Apr 2026 14:07:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775855275; x=1776460075; 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; bh=Txux4TW6NI8BBnT/9aUbbKCnnuVuxmAnvDFuD00fzoQ=; b=mTZbeYOGCChtZIIs1yEcCtGqFy+EY7EWywHT8BaoQExmqin9TMWN6v2N2aeY8Di96k 9QG+H5OUsp5vFuL6/ez4SKFEpsFcKGXKqfBIX60JbgMG9QwcR6OF4KyqYgATcBSYX1fE HrTkm1npcTkGZ3eO6oWMGmKw5qXaiGZoTf1p6KBgrg2wBz809xp6aofbFBd5n5u+tzhY /ws/XqmbpXUZ8UAugnVfeHpWsM9BQR6BYyFnT3r6CoVsONEEw+QlfIN9KPJq7uld2kHS N0UzV6SWiC+weI9+um0TA24UEbRoA91aNyWQSWBNeoUrOCNBd+m3IEWdgznXF/W8gxle zmGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775855275; x=1776460075; 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; bh=Txux4TW6NI8BBnT/9aUbbKCnnuVuxmAnvDFuD00fzoQ=; b=UrpmZiONC3pfuR3ESPLVOUO6IS1gztpkGNXM3Mj3B4BN0oJYgbj1v9DquoQ091zTf/ 6wjX9RehipR2027KBBz/taxIwpd5OtdSOCJ3eWEl2om/YQHq9M/26k6HxLZ1c41limkp NBuWLDdKKbYfr/zVoD3jbP7iz/8KG4rWFcfSRS9ckYHcZ0P5MGrQtl0rX8hUU+tw9EqE M3cxOQOe4nVIeW5QiOshukORid6e6MnjXkc1ajG4uKNjpZI/EgA2nTI1jwuDou4AZfPL cZwKKZWtpWlhlqWfTkOOk6KaqBcj5iHMp2KE+S9ZmwDG7jzXWWiy18TR+oDJp2Nd3vuM phIQ== X-Forwarded-Encrypted: i=1; AJvYcCXR2w+WeNVW7iAjYkxNi3lDMPMyWDEI/oVCBqI5kIgB2FMy38yYyWPPpuPdx6jOH5LTVb1ZgGnYMGr0agA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxlgq+xaUJBG4nPeMbb28yX9e+i6Fhidzmq9cSEbS4vMWxruZBr cFX05YU/DwS7fAoRrWXnrvopJPm7p9rjcTBDluROHcNU0+yjPgtJKJY6 X-Gm-Gg: AeBDiesPCWBR0afpd2hVgfa0hWcClkzIVWiKzt9z0r37TgnJmWH8hg8U2zVGDAr7KUO G47hiOk5K42aeThF/82u6McjBZflc7XLSUdsl2CmWIJXFZGAWyJtoF5EdK2KPb50h0G3SIucmz5 aEzpLZHGkE927PBIESjUmgY5gTBCMhij5a67bS7aX1DdIN04BLf0PEXnyYlWFfNCTvbp9sVH45w pHpNBK0+KedRHVPb1PaT+5PFxIPV/oXAJsXRuyeV9D11EcY6JzJH5VK1Lx0BMexkmmlv/bgX5Uz 5Z54LeOcu8BpEmJbynZHWYnHIaGCBnFEk262EjY7H/Lu+EH2+kTwMptajBS/UNLbgmsL/A5lgZM Tvotb6AfU6UfwRP93kgf1Hl/D4YXhROuKM57gmVp6YAAdRADlYDFdC1CWTbWonGu3ikiayjQzrO Jx6PYTDGf9J6HVPs5t57vMgw== X-Received: by 2002:a05:6820:6307:b0:685:c39e:583a with SMTP id 006d021491bc7-68be7ee7a15mr1487108eaf.30.1775855275568; Fri, 10 Apr 2026 14:07:55 -0700 (PDT) Received: from localhost ([2a03:2880:10ff:43::]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-68bc88c80a7sm1944727eaf.8.2026.04.10.14.07.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Apr 2026 14:07:55 -0700 (PDT) From: Joshua Hahn To: Johannes Weiner Cc: Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH 7/8 RFC] mm/memcontrol: optimize stock usage for cgroup v2 Date: Fri, 10 Apr 2026 14:07:01 -0700 Message-ID: <20260410210742.550489-8-joshua.hahnjy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260410210742.550489-1-joshua.hahnjy@gmail.com> References: <20260410210742.550489-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 In cgroup v2, tasks can only belong to leaf cgroups, meaning non-leaf cgroups never receive direct charges. Having stock remain in these cgroups therefore, is wasted percpu memory that will never be consumed unless all of its children are removed. To avoid leaving unused but accounted charges from remaining in non-leaf cgroups, drain the stock when leaf cgroups become parents. There is one caveat, which is concurrent charging and child creation. When a leaf cgroup becomes a parent at the same time it is still charging a task, there can be a race condition where the parent's stock is drained, then refilled by the charge. Instead of adding expensive synchronization mechanisms, accept the pages kept captive by parent page_counters which will not be able to use the stock until all its children are offlined first. It is a rare race condition, and is also bounded by MEMCG_CHARGE_BATCH = 64 pages. This optimization is not for cgroup v1, where tasks can be attached to any cgroup in the hierarchy, meaning stock can be consumed & refilled for non-leaf cgroups as well. Suggested-by: Johannes Weiner Signed-off-by: Joshua Hahn --- mm/memcontrol.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6d50f5d667434..4be1638dde180 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4130,6 +4130,17 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css) */ xa_store(&mem_cgroup_private_ids, memcg->id.id, memcg, GFP_KERNEL); + /* + * On v2, non-leaf memcgs cannot directly be charged. This child's + * parent is no longer a leaf, so drain the parent's stock. + */ + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) { + struct mem_cgroup *parent = parent_mem_cgroup(memcg); + + if (parent) + page_counter_drain_stock(&parent->memory); + } + return 0; free_objcg: for_each_node(nid) { -- 2.52.0