Re: [PATCH v2 13/28] mm: migrate: prevent memory cgroup release in folio_migrate_mapping()

From: David Hildenbrand (Red Hat)
Date: Thu Dec 18 2025 - 04:43:39 EST


On 12/18/25 10:36, Qi Zheng wrote:


On 12/18/25 5:09 PM, David Hildenbrand (Red Hat) wrote:
On 12/17/25 08:27, Qi Zheng wrote:
From: Muchun Song <songmuchun@xxxxxxxxxxxxx>

In the near future, a folio will no longer pin its corresponding
memory cgroup. To ensure safety, it will only be appropriate to
hold the rcu read lock or acquire a reference to the memory cgroup
returned by folio_memcg(), thereby preventing it from being released.

In the current patch, the rcu read lock is employed to safeguard
against the release of the memory cgroup in folio_migrate_mapping().

We usually avoid talking about "patches".

Got it.


In __folio_migrate_mapping(), the rcu read lock ...

Will do.



This serves as a preparatory measure for the reparenting of the
LRU pages.

Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
Reviewed-by: Harry Yoo <harry.yoo@xxxxxxxxxx>
---
  mm/migrate.c | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/mm/migrate.c b/mm/migrate.c
index 5169f9717f606..8bcd588c083ca 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -671,6 +671,7 @@ static int __folio_migrate_mapping(struct
address_space *mapping,
          struct lruvec *old_lruvec, *new_lruvec;
          struct mem_cgroup *memcg;
+        rcu_read_lock();
          memcg = folio_memcg(folio);

In general, LGTM

I wonder, though, whether we should embed that in the ABI.

Like "lock RCU and get the memcg" in one operation, to the "return memcg
and unock rcu" in another operation.

Do you mean adding a helper function like get_mem_cgroup_from_folio()?

Right, something like

memcg = folio_memcg_begin(folio);
folio_memcg_end(memcg);

Maybe someone reading along has a better idea. Then you can nicely document the requirements in the kerneldocs, and it is clear why the RCU lock is used (internally).

--
Cheers

David