From nobody Sat Sep 26 13:11:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3ABD0473C88; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; cv=none; b=ISm/gAamQeQTOCSxgwLvRXQgIs76sLAzOSNGJsqVe9WkuhmfVefiOA/LBcSq/lD/o0UrRjW0lfm3LyvXyfkoMBsEdm7AMJJcrA01wGeQmmT+nwCnNGHyU7osCASXSv8D345obivIrLP2Jg4M0W+yDsFXRExhimky45AmljtDxtw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; c=relaxed/simple; bh=KlUxJ5Oj10Jo6f53V6E/JY8gDtVIZbewdVdCgVfLshY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WQjxY6FQEuN5YPCB5u3287IONQpb7T24oARyb27AN7/ltG/fJqGlAS1uLlWHIik6CXv4em5cvg7h25+PT4jP9I57/QYjY7xsPGgEaZCbD9wH2npQ0RLAgKvByxGuq48jbd5PjN1vrH/K9/NK6Nkqud8oD0mIbEJHhM0zK4Q81eo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q+wPWbMJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Q+wPWbMJ" Received: by smtp.kernel.org (Postfix) with ESMTPS id CA886C2BCFA; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788253096; bh=KlUxJ5Oj10Jo6f53V6E/JY8gDtVIZbewdVdCgVfLshY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Q+wPWbMJCk+meNviZObyUyWu0S1q5aygcJ0vIBA5TP5zHaOm4TplJAiH4BpPFySeO jXDscHzc0zAOG/HMcwRWXD9XpaWU93ZFF0tfmWiw0bJ01q7Uceqo3IIq7xd/WZuxB9 2swdeXcjeKwomMGwC/lknTFwPgKJfI7c7T+t4n/aNYeh79wtPAmtVgF0ldq5pYhaXl zghGJbbDc7WYzAwYaqBJsvT/po3TeYmWpCJJ6/qmBVrboEDpdyYxkxcnC9pRBO6LIb VMVqTb+uDMcXtZ4aPdts5DLvfNV9kFrqi2EdAlj0GaZe/2w3bF9Vh9tn8+amJ8MHri 2tz4YIm78FBEA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B8B06C61DD3; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) From: Bingfang Guo via B4 Relay Date: Tue, 01 Sep 2026 16:58:00 +0800 Subject: [PATCH RFC v2 1/6] mm/memcg: add a helper to kill the memcgid on offlining Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-bingfangguo-memcgid-rework-v2-1-8edd7f7a7251@tencent.com> References: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> In-Reply-To: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Dave Chinner , Qi Zheng , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , David Hildenbrand , Lorenzo Stoakes , Bingfang Guo Cc: cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Bingfang Guo X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788253095; l=1251; i=bingfangguo@tencent.com; s=20260812; h=from:subject:message-id; bh=3jIkwaCFjFq8QjiGq9DEwjO0Gl2r32Hxoi06xqqEo54=; b=fFy5sTfWuAG/5jEHRJE44WgGDDn7U5jjh+8LxOBk/3EumTxFbZ9fB/Db50YLW6h5pywsH36vd pgSY2DJLajRDGHE5DuQDgcZ12R0BvZh2CcatUZ1nsRPAiD576IfDQcW X-Developer-Key: i=bingfangguo@tencent.com; a=ed25519; pk=q7u9S7d5e7VijWrYF9O+vv9/XvqWduVGtwGtuCObAHE= X-Endpoint-Received: by B4 Relay for bingfangguo@tencent.com/20260812 with auth_id=942 X-Original-From: Bingfang Guo Reply-To: bingfangguo@tencent.com From: Bingfang Guo The online state holds one reference on the memcg private id; it is released when the memcg goes offline. Put that release behind a small helper, mem_cgroup_private_id_kill(), so css_offline() reads clearly and the id refcount helpers stay symmetric: get_online() / kill() / put(). Signed-off-by: Bingfang Guo --- mm/memcontrol.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 256b68ffca70e..31cec9dde55f0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4048,6 +4048,11 @@ static inline void mem_cgroup_private_id_put(struct = mem_cgroup *memcg, unsigned } } =20 +static void mem_cgroup_private_id_kill(struct mem_cgroup *memcg) +{ + mem_cgroup_private_id_put(memcg, 1); +} + struct mem_cgroup *mem_cgroup_private_id_get_online(struct mem_cgroup *mem= cg, unsigned int n) { while (!refcount_add_not_zero(n, &memcg->id.ref)) { @@ -4385,7 +4390,7 @@ static void mem_cgroup_css_offline(struct cgroup_subs= ys_state *css) =20 drain_all_stock(memcg); =20 - mem_cgroup_private_id_put(memcg, 1); + mem_cgroup_private_id_kill(memcg); } =20 static void mem_cgroup_css_released(struct cgroup_subsys_state *css) --=20 2.43.7 From nobody Sat Sep 26 13:11:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3AB014734C6; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; cv=none; b=e0/8TGL5qHY0WiRVj6FS8WEGsMp0+s9ZRwsWXX+K9/fhtgTl5xBA0G+6WQlBMW/RnWwNAXEgnISWDxaT2UgDFM8Mi98wQzD7p3DNHQ+upbiQ81hjrT1LTu7wimY3IJCAfiqt9MoCbjSbyhX9kBb4LmlNK78qm6gbmzUYHFa7/tU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; c=relaxed/simple; bh=aIiuh9ou8roZ4tGxttm9/MkqYiiC/wiCDtUiGOaAUGY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gBq0/SA1n1eYwM+fKaR70bMpl8Xa0hkieMLg7/ZgiEsdBarKgkMSGPw18YDtvYQI6127Cw09UpMyUQaydz/w2O9Bg/JWGzrYlQTUUS0BZvuwXS/MrVzFhq0nK2AnKBJvX7YUkVUmVsI7ofNPq6and/EK4wpt3OdSk3fSojH1AKs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NV3Gp4if; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NV3Gp4if" Received: by smtp.kernel.org (Postfix) with ESMTPS id DCB02C2BD00; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788253096; bh=aIiuh9ou8roZ4tGxttm9/MkqYiiC/wiCDtUiGOaAUGY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=NV3Gp4ifFweltofgntqM4I5Ys5cvDmz7WMnaPulUCAhHV8UA3bQpbGbDNECc/Q5yc +KyB9lsEcxniPZmA85tkj+SJ6Mz0KAr+YAnizrLvfs4EKNquNP01JnctXttyhG/ijJ WIO9scwhne+xGVzEAUbed2MUkvjtu+mp89mRNOa15Xxp26oA8xN1qaUM+yMT1EbOdf qnwBXyn+TYx+zECCoo0+b6T1ixcSvpoUIOdsL4ia+RVeYtC6adkSoWJ0jxopeU713C aCL7yfnv5et2Q7KRow+nKvpFvheQDIs7AOEd6TA7UOE1ZThyDXb5PJsDcUH2GTe0fL 9TTUBbEmltPzw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id CB832C624C6; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) From: Bingfang Guo via B4 Relay Date: Tue, 01 Sep 2026 16:58:01 +0800 Subject: [PATCH RFC v2 2/6] mm/memcg: get memcgid reference only after swap charging success Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-bingfangguo-memcgid-rework-v2-2-8edd7f7a7251@tencent.com> References: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> In-Reply-To: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Dave Chinner , Qi Zheng , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , David Hildenbrand , Lorenzo Stoakes , Bingfang Guo Cc: cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Bingfang Guo X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788253095; l=2079; i=bingfangguo@tencent.com; s=20260812; h=from:subject:message-id; bh=ErkCRKG7+ifvfMdPwACVPkm46ElNXWlnuq1XQ4FUIi8=; b=DDtDUpfBr/Cr35KrVKoFXS5DDP6UzA+O0oBVcDic8cgdd5zeProvls7hwZXdQbkadI2cVWUcU lmlkGHHPgxyDvquRgY9UsYRryi10Q4EWn81coSXY+EukseXogsThSAF X-Developer-Key: i=bingfangguo@tencent.com; a=ed25519; pk=q7u9S7d5e7VijWrYF9O+vv9/XvqWduVGtwGtuCObAHE= X-Endpoint-Received: by B4 Relay for bingfangguo@tencent.com/20260812 with auth_id=942 X-Original-From: Bingfang Guo Reply-To: bingfangguo@tencent.com From: Bingfang Guo __mem_cgroup_try_charge_swap() pinned the memcg private id before the swap counter was charged and had to undo the pin on the failure path. Hold RCU lock for an extended period (which should be fine, __memcg1_swapout() does this as well) so concurrent memcg release can be avoided, and take the id reference to its online parent only after charging has succeeded. The failure path is now a plain return, and the id is only pinned for entries that actually end up charged to swap. Signed-off-by: Bingfang Guo --- mm/memcontrol.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 31cec9dde55f0..ecb4fb07d7735 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5755,6 +5755,7 @@ int __mem_cgroup_try_charge_swap(struct folio *folio) struct page_counter *counter; struct mem_cgroup *memcg; struct obj_cgroup *objcg; + unsigned short memcgid; =20 if (do_memsw_account()) return 0; @@ -5772,22 +5773,24 @@ int __mem_cgroup_try_charge_swap(struct folio *foli= o) return 0; } =20 - memcg =3D mem_cgroup_private_id_get_online(memcg, nr_pages); - /* memcg is pined by memcg ID. */ - rcu_read_unlock(); + while (memcg_is_dying(memcg)) + memcg =3D parent_mem_cgroup(memcg); =20 if (!mem_cgroup_is_root(memcg) && !page_counter_try_charge(&memcg->swap, nr_pages, &counter)) { memcg_memory_event(memcg, MEMCG_SWAP_MAX); memcg_memory_event(memcg, MEMCG_SWAP_FAIL); - mem_cgroup_private_id_put(memcg, nr_pages); + rcu_read_unlock(); return -ENOMEM; } mod_memcg_state(memcg, MEMCG_SWAP, nr_pages); =20 + memcg =3D mem_cgroup_private_id_get_online(memcg, nr_pages); + memcgid =3D mem_cgroup_private_id(memcg); + rcu_read_unlock(); + ci =3D swap_cluster_get_and_lock(folio); - __swap_cgroup_set(ci, swp_cluster_offset(folio->swap), nr_pages, - mem_cgroup_private_id(memcg)); + __swap_cgroup_set(ci, swp_cluster_offset(folio->swap), nr_pages, memcgid); swap_cluster_unlock(ci); =20 return 0; --=20 2.43.7 From nobody Sat Sep 26 13:11:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4205847424E; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; cv=none; b=goebwcwEneD7hTTjeIBTKWHkoYTN0pZyIoFXDsy3y2sCueOOYfm6ko4J/mdk1OJKf7SeQfOgUgxfrSJfER2oayS6kJNnEdJ1Phs2M5IqtYWAP287SQqfYzY64mByiDzXAduCghXS+kYFhQXKiEn0OfNfgC2gbE3lqtOp64dZoR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; c=relaxed/simple; bh=At7AKn+WQ2iI4/tDQ568q/Nwj4sMXoMHy77RVQT6EGs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TyooH0B1Z+F1D/ntofc02vancatHa+pqzXgUmRnGzv1WezThMBCL598s8PVSUt7T2wuJ00X9CHmcCTSdWIxbLdMbeY5te1R/blOF6tGGC+nRN75BqdxOH8gs3BS8gRa4RIjvEGDaaV+iDxH7wkpSrX3cE/Zoy7hYZ+rg2DzDlVI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VaoAPBX4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VaoAPBX4" Received: by smtp.kernel.org (Postfix) with ESMTPS id F0639C2BD04; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788253097; bh=At7AKn+WQ2iI4/tDQ568q/Nwj4sMXoMHy77RVQT6EGs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=VaoAPBX4yW0gZ33XcEMkQYlvgaVKptCDrdCsxygWTNMey8yQJR/OINpETZMfmTKDc BupBWrw2vyyjRGbB+lcm8KJquzTfoNlJ0SC0NvGztizsje6gMZre79gqcgWwwxwD28 W5DcUhM4ovHzlk0GVwZGtVydMn/ZmkuBzfmVe8wtjtLkIa45LJ5VK2CLYDD6DU4SAN WtYnGkaw/fxZ2vfpH4o59ZWWoJkNRMVanrRUIsqcNcOaItWfYQXzzxZIdKugEdaR8X XVpq+qOgU5FD5b1TAAsvmZD/wdvzLlPAM9dfXRtUyRyr0lhFJNR3EXD4yWvXBwH14s Fh7ElzAzOXRVg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id DDE4BC624D1; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) From: Bingfang Guo via B4 Relay Date: Tue, 01 Sep 2026 16:58:02 +0800 Subject: [PATCH RFC v2 3/6] mm/memcg: pass the id itself instead of memcg for putting ID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-bingfangguo-memcgid-rework-v2-3-8edd7f7a7251@tencent.com> References: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> In-Reply-To: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Dave Chinner , Qi Zheng , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , David Hildenbrand , Lorenzo Stoakes , Bingfang Guo Cc: cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Bingfang Guo X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788253095; l=2276; i=bingfangguo@tencent.com; s=20260812; h=from:subject:message-id; bh=Hme7alp92v7qswodLGOz+AEsobF9FQa4tLBqDCAkCtM=; b=c8nFHb4AUhwzs6oAknyCqJ0Pm1qLXpvYuxZxHbNmRGZsdbLVMb09sl90FHGF647pHZfMqOyHs cmyhPaHJmgHACPLgmtpGf/+GzZKmjR+RGTDIcB4wtk93DT2tIPbQDeH X-Developer-Key: i=bingfangguo@tencent.com; a=ed25519; pk=q7u9S7d5e7VijWrYF9O+vv9/XvqWduVGtwGtuCObAHE= X-Endpoint-Received: by B4 Relay for bingfangguo@tencent.com/20260812 with auth_id=942 X-Original-From: Bingfang Guo Reply-To: bingfangguo@tencent.com From: Bingfang Guo Swap uncharge knows the memcg only by its private id, and the id can outlive the memcg it used to belong to after we rebind memcgid to objcgs. Make mem_cgroup_private_id_put() take the id and resolve the memcg containing the refcount internally, and keep the underlying __mem_cgroup_private_id_put() for the offline path that still holds a memcg pointer. In the uncharge path, the memcg pointer will have to be read from the xarray twice, but we'll fix that later by returning the memcg from the put path, so the uncharge path can obtain a reference in the same step. Signed-off-by: Bingfang Guo --- mm/memcontrol.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ecb4fb07d7735..048c9bb0fad79 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4038,7 +4038,7 @@ static void mem_cgroup_private_id_remove(struct mem_c= group *memcg) } } =20 -static inline void mem_cgroup_private_id_put(struct mem_cgroup *memcg, uns= igned int n) +static void __mem_cgroup_private_id_put(struct mem_cgroup *memcg, unsigned= int n) { if (refcount_sub_and_test(n, &memcg->id.ref)) { mem_cgroup_private_id_remove(memcg); @@ -4048,9 +4048,19 @@ static inline void mem_cgroup_private_id_put(struct = mem_cgroup *memcg, unsigned } } =20 +static void mem_cgroup_private_id_put(unsigned short id, unsigned int n) +{ + struct mem_cgroup *memcg; + + rcu_read_lock(); + memcg =3D mem_cgroup_from_private_id(id); + __mem_cgroup_private_id_put(memcg, n); + rcu_read_unlock(); +} + static void mem_cgroup_private_id_kill(struct mem_cgroup *memcg) { - mem_cgroup_private_id_put(memcg, 1); + __mem_cgroup_private_id_put(memcg, 1); } =20 struct mem_cgroup *mem_cgroup_private_id_get_online(struct mem_cgroup *mem= cg, unsigned int n) @@ -5815,9 +5825,10 @@ void __mem_cgroup_uncharge_swap(unsigned short id, u= nsigned int nr_pages) page_counter_uncharge(&memcg->swap, nr_pages); } mod_memcg_state(memcg, MEMCG_SWAP, -nr_pages); - mem_cgroup_private_id_put(memcg, nr_pages); + mem_cgroup_private_id_put(id, nr_pages); } rcu_read_unlock(); + } =20 long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg) --=20 2.43.7 From nobody Sat Sep 26 13:11:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 42174474267; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; cv=none; b=Xd2vXCx11dqh4gQD+NWTdJwF3ufuWWyRpcy+A8z6q4DRtZ5A1sn91HUNwrAoIsHjdwiFo7mxDviFbZCRXAm/7JUCJxLKI+cuvySnKPwCqpRcS9oZvP5WniU+1Evvgt43JCCoEaJc138sJRQyxVwiM2doZEr6PGJpfMmev8PA+2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; c=relaxed/simple; bh=e48zmxDz9kiWmbI8h/PlXtcqt9ITTR5UArZLJzZ8S+M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A8MEMJAYwmMovh3mTQMFV04J68K5LZ/m8UFRYq0I2fUPPoC5IGcRBCISGRvEOsEkdAfQEisLTuUp/lXW6/Id3+AFmEq93cRS+0ee0KQZNQ8nhk4BmuQ6v7n8C6v4bK3cED7VckInqwruwI/N3idazvTN2jxIWVHn8MYuXon8v1E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FKbRx7OB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FKbRx7OB" Received: by smtp.kernel.org (Postfix) with ESMTPS id 0D05FC32786; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788253097; bh=e48zmxDz9kiWmbI8h/PlXtcqt9ITTR5UArZLJzZ8S+M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=FKbRx7OBlFSonSo5DUXAwFKpi3N6sW1nqpa6N/s7w1GujUVkcsgUjiW5bBrBolTld I2zMqn9o3ILxUJ1dbl7HEPwQ+kg4GefQbdE8gu5NJ9Bid967ZyrWFsy85inIn1MAPz dgYw/+CZ6NmBy3aec6QMVw3kZRyLgCPWl4msCWzeakivNWjgH1VSyYXRmXH7GJrOzL 6tL6B2fe5YOAZXDmU96Gc1WqpMppP7Bp0V6alvfdWh1JIFB5i11abW78xPGNAMpw4d d9etcydeRFwgG/qiApsIZgQcFzLRq/yZ32o6LihXjaRpOP1DziB2Bbbv6fj0ARoX9M MK0kJiaKighag== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id F1D00C61DD6; Tue, 1 Sep 2026 08:58:16 +0000 (UTC) From: Bingfang Guo via B4 Relay Date: Tue, 01 Sep 2026 16:58:03 +0800 Subject: [PATCH RFC v2 4/6] mm/memcg: return the memcg when putting memcgid Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-bingfangguo-memcgid-rework-v2-4-8edd7f7a7251@tencent.com> References: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> In-Reply-To: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Dave Chinner , Qi Zheng , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , David Hildenbrand , Lorenzo Stoakes , Bingfang Guo Cc: cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Bingfang Guo X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788253095; l=2395; i=bingfangguo@tencent.com; s=20260812; h=from:subject:message-id; bh=A1qQqLP5yDMt8FsMtFOg0bivZFdxXUGUKPpa8uP9vSI=; b=SDxnNZGTvufnF2pzh/K+4XYnYFWQcDEg+BL0G/Mxc0c0jXuvvOso6qj3wfuU3pFeXELjN/juH /qvaZjgC7g3BEC0Brs8fdvQp+grYKljsPUo0sOADm4168oeOHGOopSQ X-Developer-Key: i=bingfangguo@tencent.com; a=ed25519; pk=q7u9S7d5e7VijWrYF9O+vv9/XvqWduVGtwGtuCObAHE= X-Endpoint-Received: by B4 Relay for bingfangguo@tencent.com/20260812 with auth_id=942 X-Original-From: Bingfang Guo Reply-To: bingfangguo@tencent.com From: Bingfang Guo __mem_cgroup_uncharge_swap() needs both the memcg and the id refcount drop. Right now it looks the memcg up by id, uncharges it, then looks it up again inside mem_cgroup_private_id_put() to drop the reference. Make mem_cgroup_private_id_put() resolve the id once, drop the reference, and return the nearest online memcg with a reference held for the caller. __mem_cgroup_uncharge_swap() then uses that memcg directly and drops the reference after uncharging, avoiding the second xarray lookup. Signed-off-by: Bingfang Guo --- mm/memcontrol.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 048c9bb0fad79..f0503a1e5492d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4048,14 +4048,28 @@ static void __mem_cgroup_private_id_put(struct mem_= cgroup *memcg, unsigned int n } } =20 -static void mem_cgroup_private_id_put(unsigned short id, unsigned int n) +/** + * mem_cgroup_private_id_put - put memcgid and get the nearest online memcg + * @id: the memcg private id got from mem_cgroup_id_get_online + * @n: count of references to put + */ +static struct mem_cgroup *mem_cgroup_private_id_put(unsigned short id, uns= igned int n) { struct mem_cgroup *memcg; =20 rcu_read_lock(); memcg =3D mem_cgroup_from_private_id(id); + if (!memcg) + goto out; + __mem_cgroup_private_id_put(memcg, n); + + while (memcg_is_dying(memcg) || !mem_cgroup_tryget(memcg)) + memcg =3D parent_mem_cgroup(memcg); + +out: rcu_read_unlock(); + return memcg; } =20 static void mem_cgroup_private_id_kill(struct mem_cgroup *memcg) @@ -5816,7 +5830,7 @@ void __mem_cgroup_uncharge_swap(unsigned short id, un= signed int nr_pages) struct mem_cgroup *memcg; =20 rcu_read_lock(); - memcg =3D mem_cgroup_from_private_id(id); + memcg =3D mem_cgroup_private_id_put(id, nr_pages); if (memcg) { if (!mem_cgroup_is_root(memcg)) { if (do_memsw_account()) @@ -5825,10 +5839,10 @@ void __mem_cgroup_uncharge_swap(unsigned short id, = unsigned int nr_pages) page_counter_uncharge(&memcg->swap, nr_pages); } mod_memcg_state(memcg, MEMCG_SWAP, -nr_pages); - mem_cgroup_private_id_put(id, nr_pages); } rcu_read_unlock(); =20 + mem_cgroup_put(memcg); } =20 long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg) --=20 2.43.7 From nobody Sat Sep 26 13:11:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C58147669C; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; cv=none; b=kLd/47Mxn60LKeb3/PSjWAWIIR+2Y1hRglu6T37ZDHktjeqq3/n+YBoox6/hjk8ljojygQpo+JDdd+s3So2yaTTt1AwOcnyXNBdIyx2wozziUFOnDBPAHO0QUZesTyVLtufySBZVY2JsfEZ2Vv5VQ7SeZNJD52hPhTkx8d/zFG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; c=relaxed/simple; bh=eBHxvOGcAGkl8XBUbSO6CPPwztcyeR/jqkA9+JT2V6o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WSrqwJNLtG7/Ep+EY4iu5dTp2tOsbAaGDvn18bt28OeVSZCTOtSjhFEpnzbpAdcIKLnO728EzaApsJzeK+Pc7uU8OVpneaYFMFiy1D3gM4wmYh2WNidVPx/wjKSw8XG86Ft0oD2yTGzOJ3d5NDJmxqaLZ7Z8ByxZ8IQI4tRdzFA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=el1Gxy2h; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="el1Gxy2h" Received: by smtp.kernel.org (Postfix) with ESMTPS id 22672C32781; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788253097; bh=eBHxvOGcAGkl8XBUbSO6CPPwztcyeR/jqkA9+JT2V6o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=el1Gxy2hSb8+bf5+n/WZ0Wx2C3Z3mFBW+hlNIghjZMZFMU49vn6gVBiWeDusN7L4z pWWWR07XKd+1DFJ/mdb0sSsCAceHQrLw0/Q853s50fedZJIut3AppJDaCCI3oMygI4 1NdGlSzuateMijGyDPXB2Ukpepe1flMZNFeDJ8p0ichXhs5PJQWdnDlIhlXlglDrtR ppPgt9+WmLUFKEWvy5uatexvh/vZgDR2aWv+kZahAfqgIEzORMvwa3D7r2c+oEjIt4 nrDA9EUTdb5d8C6QEiIr4DX0zh8rgyW+corHGt+/wyKZgZT8S3WngdDLmCOZrNuLtv TZq9/Tzz+TXLw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 112FFC61DD3; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) From: Bingfang Guo via B4 Relay Date: Tue, 01 Sep 2026 16:58:04 +0800 Subject: [PATCH RFC v2 5/6] mm/memcg: move memcg private ID refcount to objcg Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-bingfangguo-memcgid-rework-v2-5-8edd7f7a7251@tencent.com> References: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> In-Reply-To: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Dave Chinner , Qi Zheng , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , David Hildenbrand , Lorenzo Stoakes , Bingfang Guo Cc: cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Bingfang Guo X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788253095; l=8148; i=bingfangguo@tencent.com; s=20260812; h=from:subject:message-id; bh=bz0oJJYOZ1ur7mPkUre9OVRRcvB/FU5h49DJMMfeoYg=; b=0fR3itNFCPfxBX75td2l9MmkZhoxtn6FEtoAv958EYYfiOFI/GM3Ob6dIYQn3aUesuVKevOCm JzYj0H0mdFHCs1WEyHffculcUenUNo/vW7C0cT3G8lYGUE7aY/gHx+b X-Developer-Key: i=bingfangguo@tencent.com; a=ed25519; pk=q7u9S7d5e7VijWrYF9O+vv9/XvqWduVGtwGtuCObAHE= X-Endpoint-Received: by B4 Relay for bingfangguo@tencent.com/20260812 with auth_id=942 X-Original-From: Bingfang Guo Reply-To: bingfangguo@tencent.com From: Bingfang Guo The memcg private ID is used by objects that can't afford storing a whole pointer and can outlive memcgs to track the memcg (notably swap entries). The current design holds a refcount to the css, preventing the memcg from being freed. This patch unbinds the lifetime of memcgid from the memcg so it can be freed. The idea is to move the refcount of memcgid to one of the memcg's objcg and hold a pointer and a reference to the objcg in the global memcgid xarray. No more css reference to the memcg so swapped out pages no longer pin the dying memcg. When retrieving the online memcg from the id, the objcg is taken out of the xarray, and resolves to the online parent memcg naturally, which is exactly what is expected in normal swapin folio charging path. For swap uncharging, the objcg is used for putting the id refcount and getting the online ancestor in one go. The exceptions are list_lru and workingset recent test, which require exact the memcg the id points to. Those callers are fixed in the next patch. Signed-off-by: Bingfang Guo --- include/linux/memcontrol.h | 15 +++++----- mm/memcontrol.c | 71 +++++++++++++++++++++++++++++++-----------= ---- 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f227348a3f24a..eafc817ff244c 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -66,11 +66,6 @@ struct mem_cgroup_reclaim_cookie { =20 #define MEM_CGROUP_ID_SHIFT 16 =20 -struct mem_cgroup_private_id { - int id; - refcount_t ref; -}; - struct memcg_vmstats_percpu; struct memcg1_events_percpu; struct memcg_vmstats; @@ -173,6 +168,7 @@ struct obj_cgroup { struct percpu_ref refcnt; struct mem_cgroup *memcg; atomic_t nr_charged_bytes; + refcount_t memcgid_ref; union { struct list_head list; /* protected by objcg_lock */ struct rcu_head rcu; @@ -189,8 +185,8 @@ struct obj_cgroup { struct mem_cgroup { struct cgroup_subsys_state css; =20 - /* Private memcg ID. Used to ID objects that outlive the cgroup */ - struct mem_cgroup_private_id id; + /* The objcg holding private memcg ID. */ + struct obj_cgroup *id_objcg; =20 /* Accounted resources */ struct page_counter memory; /* Both v1 & v2 */ @@ -255,6 +251,9 @@ struct mem_cgroup { #endif int kmemcg_id; =20 + /* Private memcg ID. Used to ID objects that outlive the cgroup */ + int id; + #ifdef CONFIG_CGROUP_WRITEBACK struct list_head cgwb_list; #endif @@ -810,7 +809,7 @@ static inline unsigned short mem_cgroup_private_id(stru= ct mem_cgroup *memcg) if (mem_cgroup_disabled()) return 0; =20 - return memcg->id.id; + return memcg->id; } struct mem_cgroup *mem_cgroup_from_private_id(unsigned short id); =20 diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f0503a1e5492d..38d2b00657a7a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3773,7 +3773,7 @@ static void memcg_online_kmem(struct mem_cgroup *memc= g) =20 static_branch_enable(&memcg_kmem_online_key); =20 - memcg->kmemcg_id =3D memcg->id.id; + memcg->kmemcg_id =3D memcg->id; } =20 static void memcg_offline_kmem(struct mem_cgroup *memcg) @@ -4032,19 +4032,23 @@ static DEFINE_XARRAY_ALLOC1(mem_cgroup_private_ids); =20 static void mem_cgroup_private_id_remove(struct mem_cgroup *memcg) { - if (memcg->id.id > 0) { - xa_erase(&mem_cgroup_private_ids, memcg->id.id); - memcg->id.id =3D 0; + if (memcg->id > 0) { + xa_erase(&mem_cgroup_private_ids, memcg->id); + memcg->id =3D 0; } } =20 -static void __mem_cgroup_private_id_put(struct mem_cgroup *memcg, unsigned= int n) +static void __mem_cgroup_private_id_put(struct obj_cgroup *objcg, + unsigned short id, unsigned int n) { - if (refcount_sub_and_test(n, &memcg->id.ref)) { - mem_cgroup_private_id_remove(memcg); + struct obj_cgroup *objcg_free; =20 - /* Memcg ID pins CSS */ - css_put(&memcg->css); + if (refcount_sub_and_test(n, &objcg->memcgid_ref)) { + objcg_free =3D xa_erase(&mem_cgroup_private_ids, id); + VM_WARN_ON(objcg_free !=3D objcg); + + /* Memcg ID pins the objcg */ + obj_cgroup_put(objcg); } } =20 @@ -4055,18 +4059,20 @@ static void __mem_cgroup_private_id_put(struct mem_= cgroup *memcg, unsigned int n */ static struct mem_cgroup *mem_cgroup_private_id_put(unsigned short id, uns= igned int n) { - struct mem_cgroup *memcg; + struct mem_cgroup *memcg =3D NULL; + struct obj_cgroup *objcg; =20 rcu_read_lock(); - memcg =3D mem_cgroup_from_private_id(id); - if (!memcg) + objcg =3D xa_load(&mem_cgroup_private_ids, id); + if (unlikely(!objcg)) goto out; =20 - __mem_cgroup_private_id_put(memcg, n); - + memcg =3D obj_cgroup_memcg(objcg); while (memcg_is_dying(memcg) || !mem_cgroup_tryget(memcg)) memcg =3D parent_mem_cgroup(memcg); =20 + __mem_cgroup_private_id_put(objcg, id, n); + out: rcu_read_unlock(); return memcg; @@ -4074,12 +4080,17 @@ static struct mem_cgroup *mem_cgroup_private_id_put= (unsigned short id, unsigned =20 static void mem_cgroup_private_id_kill(struct mem_cgroup *memcg) { - __mem_cgroup_private_id_put(memcg, 1); + __mem_cgroup_private_id_put(memcg->id_objcg, memcg->id, 1); } =20 struct mem_cgroup *mem_cgroup_private_id_get_online(struct mem_cgroup *mem= cg, unsigned int n) { - while (!refcount_add_not_zero(n, &memcg->id.ref)) { + struct obj_cgroup *objcg; + + rcu_read_lock(); + objcg =3D memcg->id_objcg; + + while (!refcount_add_not_zero(n, &objcg->memcgid_ref)) { /* * The root cgroup cannot be destroyed, so it's refcount must * always be >=3D 1. @@ -4089,7 +4100,10 @@ struct mem_cgroup *mem_cgroup_private_id_get_online(= struct mem_cgroup *memcg, un break; } memcg =3D parent_mem_cgroup(memcg); + objcg =3D memcg->id_objcg; } + + rcu_read_unlock(); return memcg; } =20 @@ -4101,8 +4115,14 @@ struct mem_cgroup *mem_cgroup_private_id_get_online(= struct mem_cgroup *memcg, un */ struct mem_cgroup *mem_cgroup_from_private_id(unsigned short id) { + struct obj_cgroup *objcg; WARN_ON_ONCE(!rcu_read_lock_held()); - return xa_load(&mem_cgroup_private_ids, id); + + objcg =3D xa_load(&mem_cgroup_private_ids, id); + if (!objcg) + return NULL; + + return obj_cgroup_memcg(objcg); } =20 struct mem_cgroup *mem_cgroup_get_from_id(u64 id) @@ -4203,7 +4223,7 @@ static struct mem_cgroup *mem_cgroup_alloc(struct mem= _cgroup *parent) if (!memcg) return ERR_PTR(-ENOMEM); =20 - error =3D xa_alloc(&mem_cgroup_private_ids, &memcg->id.id, NULL, + error =3D xa_alloc(&mem_cgroup_private_ids, &memcg->id, NULL, XA_LIMIT(1, MEM_CGROUP_ID_MAX), GFP_KERNEL); if (error) goto fail; @@ -4348,9 +4368,10 @@ static int mem_cgroup_css_online(struct cgroup_subsy= s_state *css) FLUSH_TIME); lru_gen_online_memcg(memcg); =20 - /* Online state pins memcg ID, memcg ID pins CSS */ - refcount_set(&memcg->id.ref, 1); - css_get(css); + /* CSS pins memcg ID, memcg ID pins obj cgroup */ + memcg->id_objcg =3D objcg; + refcount_set(&memcg->id_objcg->memcgid_ref, 1); + obj_cgroup_get(memcg->id_objcg); =20 /* * Ensure mem_cgroup_from_private_id() works once we're fully online. @@ -4362,7 +4383,7 @@ static int mem_cgroup_css_online(struct cgroup_subsys= _state *css) * publish it here at the end of onlining. This matches the * regular ID destruction during offlining. */ - xa_store(&mem_cgroup_private_ids, memcg->id.id, memcg, GFP_KERNEL); + xa_store(&mem_cgroup_private_ids, memcg->id, memcg->id_objcg, GFP_KERNEL); =20 return 0; free_objcg: @@ -5832,7 +5853,11 @@ void __mem_cgroup_uncharge_swap(unsigned short id, u= nsigned int nr_pages) rcu_read_lock(); memcg =3D mem_cgroup_private_id_put(id, nr_pages); if (memcg) { - if (!mem_cgroup_is_root(memcg)) { + /* + * If the memcg was offline and reparented to root, swap needs + * uncharging as well. We check this by comparing the memcgid. + */ + if (!mem_cgroup_is_root(memcg) || id !=3D mem_cgroup_private_id(memcg)) { if (do_memsw_account()) page_counter_uncharge(&memcg->memsw, nr_pages); else --=20 2.43.7 From nobody Sat Sep 26 13:11:25 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C4CF47669B; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; cv=none; b=liUqf8oP9qSA9gJyWrNW9mFwHSaMdvJjw79DU2xnVb37Ge4roU5ZkkWugrc/jsQ0bn8scw3b712fdg0oTGoomv8roqEw2j89vFlIoXXSOQDF+akJNLOdhNssxToCExXO2r0D/y9dVt4lMahRuOhamEsrZjzcxDjxSBFaOpZcu6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788253097; c=relaxed/simple; bh=RhjZ8Agl3sbbRZCe+duMO20xLmPNeawkGM6PaCP7BIU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mGHucXi8N2/eABPM0I/4xvzD5LHQgQmThnnEJnNJkM7Zezz2NvzpSxWAPjQ4JTWaSfg1pWJ9dotLegXj/jDGZkpWAsa/fhriu5f8mIGBwAUalIpw/6R5t2nrRL+mltJ9puiri6ckcCJtQm4jgZVO+0ROcp6VGVH/jciRgv4l3iQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eNWnrYfv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eNWnrYfv" Received: by smtp.kernel.org (Postfix) with ESMTPS id 34C27C2BCF5; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788253097; bh=RhjZ8Agl3sbbRZCe+duMO20xLmPNeawkGM6PaCP7BIU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=eNWnrYfvyw2Nw5Ae/WmE6KRgB71Jmk+QUTfqxG0E0jixwesnQjD286+bgs/Nvdlfj JQeNVGKl8C5wwutpJCWWcf9U+ZCTtimqNGsIYzcE8SYk056VbTH1qjVxo5vHkFsyd0 Cg0TsSSs1sdFrqf7Yh9/2RrnyTCGy9IvN8AS7pLTNs0YSRZ/x85Ry9pLPZpFxbsIr4 r8THGowmgpumSPzeFm7QROsdrBgAeWPQRHmkDGcZIWlocVEdLgSZjif6F4QPw8v6hA 5NQ+VShwIhVaApCOCBvMQ6I33biHNj7UkXxpCtbAGPtMs4mJb05aKvzXC/cEXrbgMx g9xg7zfjtkRBA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22DA7C624CF; Tue, 1 Sep 2026 08:58:17 +0000 (UTC) From: Bingfang Guo via B4 Relay Date: Tue, 01 Sep 2026 16:58:05 +0800 Subject: [PATCH RFC v2 6/6] mm/memcg: filter out reparented memcgs got from memcgid Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260901-bingfangguo-memcgid-rework-v2-6-8edd7f7a7251@tencent.com> References: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> In-Reply-To: <20260901-bingfangguo-memcgid-rework-v2-0-8edd7f7a7251@tencent.com> To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Dave Chinner , Qi Zheng , Kairui Song , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , David Hildenbrand , Lorenzo Stoakes , Bingfang Guo Cc: cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Bingfang Guo X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788253095; l=2534; i=bingfangguo@tencent.com; s=20260812; h=from:subject:message-id; bh=lyLjAgWvu8z4Mx3sqViPTPHcL3MXNW/gr5r9+kucGwg=; b=5xj+J76UVmxnZQVNFQ+zRSPDR6UAzTih6ycgAZjO5VvTHyXssOM33/ei2NDEyHihaq21+da96 MKCaUTHN9j0A6KLo/1zLukpvbxwxLE1BM6WpuN+T9oeiSyyRVaMXTp2 X-Developer-Key: i=bingfangguo@tencent.com; a=ed25519; pk=q7u9S7d5e7VijWrYF9O+vv9/XvqWduVGtwGtuCObAHE= X-Endpoint-Received: by B4 Relay for bingfangguo@tencent.com/20260812 with auth_id=942 X-Original-From: Bingfang Guo Reply-To: bingfangguo@tencent.com From: Bingfang Guo mem_cgroup_from_private_id() looks up the objcg that owns the id and returns the objcg's current memcg. After reparenting, that memcg can differ from the one the id originally belonged to. Callers such as the list lru and workingset refault code expect to get back exactly the memcg referred to by the memcgid, so check that the returned memcg still owns the id and return NULL otherwise. In this case, make list_lru just skip and workingset tests use the root (as the comments said in workingset.c:460). Signed-off-by: Bingfang Guo --- mm/list_lru.c | 2 +- mm/memcontrol.c | 9 ++++++++- mm/workingset.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/mm/list_lru.c b/mm/list_lru.c index 36662d02ff963..bc956267f6835 100644 --- a/mm/list_lru.c +++ b/mm/list_lru.c @@ -428,7 +428,7 @@ unsigned long list_lru_walk_node(struct list_lru *lru, = int nid, xa_for_each(&lru->xa, index, mlru) { rcu_read_lock(); memcg =3D mem_cgroup_from_private_id(index); - if (!mem_cgroup_tryget(memcg)) { + if (!memcg || !mem_cgroup_tryget(memcg)) { rcu_read_unlock(); continue; } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 38d2b00657a7a..84dcab3acb8a2 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4112,17 +4112,24 @@ struct mem_cgroup *mem_cgroup_private_id_get_online= (struct mem_cgroup *memcg, un * @id: the memcg id to look up * * Caller must hold rcu_read_lock(). + * + * @return: the memcg, or NULL if the memcg is already reparented. */ struct mem_cgroup *mem_cgroup_from_private_id(unsigned short id) { struct obj_cgroup *objcg; + struct mem_cgroup *memcg; WARN_ON_ONCE(!rcu_read_lock_held()); =20 objcg =3D xa_load(&mem_cgroup_private_ids, id); if (!objcg) return NULL; =20 - return obj_cgroup_memcg(objcg); + memcg =3D obj_cgroup_memcg(objcg); + if (mem_cgroup_private_id(memcg) !=3D id) + return NULL; + + return memcg; } =20 struct mem_cgroup *mem_cgroup_get_from_id(u64 id) diff --git a/mm/workingset.c b/mm/workingset.c index 7ac2b88c80ae5..4e9b7b163c01e 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -470,7 +470,7 @@ bool workingset_test_recent(void *shadow, bool file, bo= ol *workingset, * configurations instead. */ eviction_memcg =3D mem_cgroup_from_private_id(memcgid); - if (!mem_cgroup_tryget(eviction_memcg)) + if (eviction_memcg && !mem_cgroup_tryget(eviction_memcg)) eviction_memcg =3D NULL; rcu_read_unlock(); =20 --=20 2.43.7