* [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid
@ 2026-07-24 6:01 dayou5941
2026-07-24 6:01 ` [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() dayou5941
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: dayou5941 @ 2026-07-24 6:01 UTC (permalink / raw)
To: sj, akpm; +Cc: damon, liyouhong, stable
From: liyouhong <liyouhong@kylinos.cn>
damon_pa_migrate() and damos_va_migrate() isolate folios into a local list
and then call damon_migrate_pages(). When target_nid is invalid (including
the scheme default NUMA_NO_NODE / -1), damon_migrate_pages() returns early
without putting the folios back to the LRU.
Callers then discard the list head while those folios remain isolated with
an extra reference taken by folio_isolate_lru(). The pages stay off the
LRU for as long as the mapping exists (anon active+inactive counts drop
while RSS does not), and the leftover references can pin the pages after
the mapping is gone.
Put the folios back on the invalid-nid path so ignored migration requests
still return them to the LRU.
Fixes: 7e6c3130690a ("mm/damon/ops-common: ignore migration request to invalid nodes")
Cc: <stable@vger.kernel.org>
Assisted-by: Cursor:grok-4.5
Signed-off-by: liyouhong <liyouhong@kylinos.cn>
---
v2:
- Drop the putback helper for easier stable backport
- Open-code putback only on the invalid-nid path
- Keep the original indentation and Cc stable@
- Add a separate cleanup as 2/2 (factor out damon_putback_folio_list)
---
mm/damon/ops-common.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c
index d1842e2b00ef..f5ded45fabd1 100644
--- a/mm/damon/ops-common.c
+++ b/mm/damon/ops-common.c
@@ -394,8 +394,15 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid)
return nr_migrated;
if (target_nid < 0 || target_nid >= MAX_NUMNODES ||
- !node_state(target_nid, N_MEMORY))
+ !node_state(target_nid, N_MEMORY)) {
+ while (!list_empty(folio_list)) {
+ struct folio *folio = lru_to_folio(folio_list);
+
+ list_del(&folio->lru);
+ folio_putback_lru(folio);
+ }
return nr_migrated;
+ }
noreclaim_flag = memalloc_noreclaim_save();
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() 2026-07-24 6:01 [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid dayou5941 @ 2026-07-24 6:01 ` dayou5941 2026-07-24 6:07 ` sashiko-bot 2026-07-24 14:39 ` SJ Park 2026-07-24 14:26 ` [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid SJ Park 2026-07-24 14:41 ` SJ Park 2 siblings, 2 replies; 9+ messages in thread From: dayou5941 @ 2026-07-24 6:01 UTC (permalink / raw) To: sj, akpm; +Cc: damon, liyouhong From: liyouhong <liyouhong@kylinos.cn> The putback loop is duplicated in damon_migrate_folio_list() and on the invalid-nid path of damon_migrate_pages(). Factor it into a small helper for readability. No functional change. Signed-off-by: liyouhong <liyouhong@kylinos.cn> --- mm/damon/ops-common.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c index f5ded45fabd1..9a1e8aec5444 100644 --- a/mm/damon/ops-common.c +++ b/mm/damon/ops-common.c @@ -331,12 +331,22 @@ static unsigned int __damon_migrate_folio_list( return nr_succeeded; } +static void damon_putback_folio_list(struct list_head *folio_list) +{ + struct folio *folio; + + while (!list_empty(folio_list)) { + folio = lru_to_folio(folio_list); + list_del(&folio->lru); + folio_putback_lru(folio); + } +} + static unsigned int damon_migrate_folio_list(struct list_head *folio_list, struct pglist_data *pgdat, int target_nid) { unsigned int nr_migrated = 0; - struct folio *folio; LIST_HEAD(ret_folios); LIST_HEAD(migrate_folios); @@ -374,11 +384,7 @@ static unsigned int damon_migrate_folio_list(struct list_head *folio_list, list_splice(&ret_folios, folio_list); - while (!list_empty(folio_list)) { - folio = lru_to_folio(folio_list); - list_del(&folio->lru); - folio_putback_lru(folio); - } + damon_putback_folio_list(folio_list); return nr_migrated; } @@ -395,12 +401,7 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) if (target_nid < 0 || target_nid >= MAX_NUMNODES || !node_state(target_nid, N_MEMORY)) { - while (!list_empty(folio_list)) { - struct folio *folio = lru_to_folio(folio_list); - - list_del(&folio->lru); - folio_putback_lru(folio); - } + damon_putback_folio_list(folio_list); return nr_migrated; } -- 2.25.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() 2026-07-24 6:01 ` [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() dayou5941 @ 2026-07-24 6:07 ` sashiko-bot 2026-07-24 14:39 ` SJ Park 1 sibling, 0 replies; 9+ messages in thread From: sashiko-bot @ 2026-07-24 6:07 UTC (permalink / raw) To: dayou5941; +Cc: damon Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Low] Removal of the `struct folio *folio;` local variable declaration causes a build failure. -- --- Patch [2]: [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() --- commit 44363c3cc00338e3c3445bc5730a2655a4c0fded Author: liyouhong <liyouhong@kylinos.cn> mm/damon/ops-common: factor out damon_putback_folio_list() This patch factors out the duplicated folio putback loop from damon_migrate_folio_list() and damon_migrate_pages() into a new helper function, damon_putback_folio_list(). > diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c > index 0981a5e3af172..4b99c31122d6d 100644 > --- a/mm/damon/ops-common.c > +++ b/mm/damon/ops-common.c [ ... ] > @@ -330,12 +330,22 @@ static unsigned int __damon_migrate_folio_list( [ ... ] > static unsigned int damon_migrate_folio_list(struct list_head *folio_list, > struct pglist_data *pgdat, > int target_nid) > { > unsigned int nr_migrated = 0; > - struct folio *folio; [Severity: Low] Does removing this declaration result in a build failure? The folio variable appears to still be used in damon_migrate_folio_list() during the initial loop over folio_list: while (!list_empty(folio_list)) { cond_resched(); folio = lru_to_folio(folio_list); list_del(&folio->lru); ... > LIST_HEAD(ret_folios); > LIST_HEAD(migrate_folios); -- Sashiko AI review · https://sashiko.dev/#/patchset/20260724060135.3014676-1-dayou5941@163.com?part=2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() 2026-07-24 6:01 ` [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() dayou5941 2026-07-24 6:07 ` sashiko-bot @ 2026-07-24 14:39 ` SJ Park 2026-07-24 14:56 ` SJ Park 1 sibling, 1 reply; 9+ messages in thread From: SJ Park @ 2026-07-24 14:39 UTC (permalink / raw) To: dayou5941; +Cc: SJ Park, akpm, damon, liyouhong, linux-mm, linux-kernel 'get_maintainer.pl --nogit --nogit-fallback' suggests adding below recipients. I added them. Please consier using get_maintainer.pl from the next time. - linux-mm@kvack.org - linux-kernel@vger.kernel.org On Fri, 24 Jul 2026 14:01:35 +0800 dayou5941@163.com wrote: > From: liyouhong <liyouhong@kylinos.cn> > > The putback loop is duplicated in damon_migrate_folio_list() and on the > invalid-nid path of damon_migrate_pages(). Factor it into a small helper > for readability. No functional change. This is not a hotfix. I'd suggest sending this separately, not together with the first patch of this series. Sending hotfix together with non-hotfix when they don't really need to be applied together only makes it complicated. > > Signed-off-by: liyouhong <liyouhong@kylinos.cn> > --- > mm/damon/ops-common.c | 25 +++++++++++++------------ > 1 file changed, 13 insertions(+), 12 deletions(-) > > diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c > index f5ded45fabd1..9a1e8aec5444 100644 > --- a/mm/damon/ops-common.c > +++ b/mm/damon/ops-common.c > @@ -331,12 +331,22 @@ static unsigned int __damon_migrate_folio_list( > return nr_succeeded; > } > > +static void damon_putback_folio_list(struct list_head *folio_list) > +{ > + struct folio *folio; > + > + while (!list_empty(folio_list)) { > + folio = lru_to_folio(folio_list); > + list_del(&folio->lru); > + folio_putback_lru(folio); > + } > +} > + > static unsigned int damon_migrate_folio_list(struct list_head *folio_list, > struct pglist_data *pgdat, > int target_nid) > { > unsigned int nr_migrated = 0; > - struct folio *folio; > LIST_HEAD(ret_folios); > LIST_HEAD(migrate_folios); > > @@ -374,11 +384,7 @@ static unsigned int damon_migrate_folio_list(struct list_head *folio_list, > > list_splice(&ret_folios, folio_list); > > - while (!list_empty(folio_list)) { > - folio = lru_to_folio(folio_list); > - list_del(&folio->lru); > - folio_putback_lru(folio); > - } > + damon_putback_folio_list(folio_list); > > return nr_migrated; > } > @@ -395,12 +401,7 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) > > if (target_nid < 0 || target_nid >= MAX_NUMNODES || > !node_state(target_nid, N_MEMORY)) { > - while (!list_empty(folio_list)) { > - struct folio *folio = lru_to_folio(folio_list); > - > - list_del(&folio->lru); > - folio_putback_lru(folio); > - } > + damon_putback_folio_list(folio_list); > return nr_migrated; > } Looks better. But, how about further simplifying it by moving the folios putback from damon_migrate_pages(), and doing that from damon_migrate_pages()? damon_migrate_pages() would do the putback always before returning, and the taregt_nid path will 'goto' the path. E.g., --- a/mm/damon/ops-common.c +++ b/mm/damon/ops-common.c @@ -391,15 +391,8 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) return nr_migrated; if (target_nid < 0 || target_nid >= MAX_NUMNODES || - !node_state(target_nid, N_MEMORY)) { - while (!list_empty(folio_list)) { - struct folio *folio = lru_to_folio(folio_list); - - list_del(&folio->lru); - folio_putback_lru(folio); - } - return nr_migrated; - } + !node_state(target_nid, N_MEMORY)) + goto out; noreclaim_flag = memalloc_noreclaim_save(); @@ -424,6 +417,14 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) memalloc_noreclaim_restore(noreclaim_flag); +out: + + while (!list_empty(folio_list)) { + struct folio *folio = lru_to_folio(folio_list); + + list_del(&folio->lru); + folio_putback_lru(folio); + } return nr_migrated; } This could be applied to the first patch. And this patch can simply remove the redundanty putback. > > -- > 2.25.1 [1] https://lore.kernel.org/20260724060707.CE1F81F000E9@smtp.kernel.org Thanks, SJ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() 2026-07-24 14:39 ` SJ Park @ 2026-07-24 14:56 ` SJ Park 0 siblings, 0 replies; 9+ messages in thread From: SJ Park @ 2026-07-24 14:56 UTC (permalink / raw) To: SJ Park; +Cc: dayou5941, akpm, damon, liyouhong, linux-mm, linux-kernel On Fri, 24 Jul 2026 07:39:24 -0700 SJ Park <sj@kernel.org> wrote: > 'get_maintainer.pl --nogit --nogit-fallback' suggests adding below recipients. > I added them. Please consier using get_maintainer.pl from the next time. > > - linux-mm@kvack.org > - linux-kernel@vger.kernel.org > > On Fri, 24 Jul 2026 14:01:35 +0800 dayou5941@163.com wrote: > > > From: liyouhong <liyouhong@kylinos.cn> > > > > The putback loop is duplicated in damon_migrate_folio_list() and on the > > invalid-nid path of damon_migrate_pages(). Factor it into a small helper > > for readability. No functional change. > > This is not a hotfix. I'd suggest sending this separately, not together with > the first patch of this series. Sending hotfix together with non-hotfix when > they don't really need to be applied together only makes it complicated. > > > > > Signed-off-by: liyouhong <liyouhong@kylinos.cn> > > --- > > mm/damon/ops-common.c | 25 +++++++++++++------------ > > 1 file changed, 13 insertions(+), 12 deletions(-) > > > > diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c > > index f5ded45fabd1..9a1e8aec5444 100644 > > --- a/mm/damon/ops-common.c > > +++ b/mm/damon/ops-common.c > > @@ -331,12 +331,22 @@ static unsigned int __damon_migrate_folio_list( > > return nr_succeeded; > > } > > > > +static void damon_putback_folio_list(struct list_head *folio_list) > > +{ > > + struct folio *folio; > > + > > + while (!list_empty(folio_list)) { > > + folio = lru_to_folio(folio_list); > > + list_del(&folio->lru); > > + folio_putback_lru(folio); > > + } > > +} > > + > > static unsigned int damon_migrate_folio_list(struct list_head *folio_list, > > struct pglist_data *pgdat, > > int target_nid) > > { > > unsigned int nr_migrated = 0; > > - struct folio *folio; I forgot mentioning this breaks build, as Sashiko also pointed [1] out. This patch cannot be applied as-is. [1] https://lore.kernel.org/20260724060707.CE1F81F000E9@smtp.kernel.org Thanks, SJ > > LIST_HEAD(ret_folios); > > LIST_HEAD(migrate_folios); > > > > @@ -374,11 +384,7 @@ static unsigned int damon_migrate_folio_list(struct list_head *folio_list, > > > > list_splice(&ret_folios, folio_list); > > > > - while (!list_empty(folio_list)) { > > - folio = lru_to_folio(folio_list); > > - list_del(&folio->lru); > > - folio_putback_lru(folio); > > - } > > + damon_putback_folio_list(folio_list); > > > > return nr_migrated; > > } > > @@ -395,12 +401,7 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) > > > > if (target_nid < 0 || target_nid >= MAX_NUMNODES || > > !node_state(target_nid, N_MEMORY)) { > > - while (!list_empty(folio_list)) { > > - struct folio *folio = lru_to_folio(folio_list); > > - > > - list_del(&folio->lru); > > - folio_putback_lru(folio); > > - } > > + damon_putback_folio_list(folio_list); > > return nr_migrated; > > } > > Looks better. But, how about further simplifying it by moving the folios > putback from damon_migrate_pages(), and doing that from damon_migrate_pages()? > damon_migrate_pages() would do the putback always before returning, and the > taregt_nid path will 'goto' the path. E.g., > > --- a/mm/damon/ops-common.c > +++ b/mm/damon/ops-common.c > @@ -391,15 +391,8 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) > return nr_migrated; > > if (target_nid < 0 || target_nid >= MAX_NUMNODES || > - !node_state(target_nid, N_MEMORY)) { > - while (!list_empty(folio_list)) { > - struct folio *folio = lru_to_folio(folio_list); > - > - list_del(&folio->lru); > - folio_putback_lru(folio); > - } > - return nr_migrated; > - } > + !node_state(target_nid, N_MEMORY)) > + goto out; > > noreclaim_flag = memalloc_noreclaim_save(); > > @@ -424,6 +417,14 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) > > memalloc_noreclaim_restore(noreclaim_flag); > > +out: > + > + while (!list_empty(folio_list)) { > + struct folio *folio = lru_to_folio(folio_list); > + > + list_del(&folio->lru); > + folio_putback_lru(folio); > + } > return nr_migrated; > } > > This could be applied to the first patch. And this patch can simply remove the > redundanty putback. > > > > > -- > > 2.25.1 > > [1] https://lore.kernel.org/20260724060707.CE1F81F000E9@smtp.kernel.org > > > Thanks, > SJ > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid 2026-07-24 6:01 [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid dayou5941 2026-07-24 6:01 ` [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() dayou5941 @ 2026-07-24 14:26 ` SJ Park 2026-07-24 14:30 ` SJ Park 2026-07-24 14:41 ` SJ Park 2 siblings, 1 reply; 9+ messages in thread From: SJ Park @ 2026-07-24 14:26 UTC (permalink / raw) To: dayou5941 Cc: SJ Park, akpm, damon, liyouhong, stable, Joshua Hahn, linux-mm, linux-kernel 'checkpatch.pl --nogit --nogit-fallback' suggests adding below recipients. I added them. Please consider using get_maintainer.pl from next time. - Joshua Hahn <joshua.hahnjy@gmail.com> - linux-mm@kvack.org - linux-kernel@vger.kernel.org On Fri, 24 Jul 2026 14:01:34 +0800 dayou5941@163.com wrote: > From: liyouhong <liyouhong@kylinos.cn> > > damon_pa_migrate() and damos_va_migrate() isolate folios into a local list > and then call damon_migrate_pages(). When target_nid is invalid (including > the scheme default NUMA_NO_NODE / -1), damon_migrate_pages() returns early > without putting the folios back to the LRU. > > Callers then discard the list head while those folios remain isolated with > an extra reference taken by folio_isolate_lru(). The pages stay off the > LRU for as long as the mapping exists (anon active+inactive counts drop > while RSS does not), and the leftover references can pin the pages after > the mapping is gone. > > Put the folios back on the invalid-nid path so ignored migration requests > still return them to the LRU. Thank you for finding and fixing this! > > Fixes: 7e6c3130690a ("mm/damon/ops-common: ignore migration request to invalid nodes") > Cc: <stable@vger.kernel.org> > Assisted-by: Cursor:grok-4.5 > Signed-off-by: liyouhong <liyouhong@kylinos.cn> Reviewed-by: SJ Park <sj@kernel.org> Thanks, SJ [...] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid 2026-07-24 14:26 ` [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid SJ Park @ 2026-07-24 14:30 ` SJ Park 0 siblings, 0 replies; 9+ messages in thread From: SJ Park @ 2026-07-24 14:30 UTC (permalink / raw) To: SJ Park Cc: dayou5941, akpm, damon, liyouhong, stable, Joshua Hahn, linux-mm, linux-kernel On Fri, 24 Jul 2026 07:26:38 -0700 SJ Park <sj@kernel.org> wrote: > > 'checkpatch.pl --nogit --nogit-fallback' suggests adding below recipients. I I mean, get_maintainer.pl. Sorry if it confused you. THanks, SJ [...] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid 2026-07-24 6:01 [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid dayou5941 2026-07-24 6:01 ` [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() dayou5941 2026-07-24 14:26 ` [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid SJ Park @ 2026-07-24 14:41 ` SJ Park 2026-07-24 15:56 ` SJ Park 2 siblings, 1 reply; 9+ messages in thread From: SJ Park @ 2026-07-24 14:41 UTC (permalink / raw) To: dayou5941; +Cc: SJ Park, akpm, damon, liyouhong, stable On Fri, 24 Jul 2026 14:01:34 +0800 dayou5941@163.com wrote: > From: liyouhong <liyouhong@kylinos.cn> > > damon_pa_migrate() and damos_va_migrate() isolate folios into a local list > and then call damon_migrate_pages(). When target_nid is invalid (including > the scheme default NUMA_NO_NODE / -1), damon_migrate_pages() returns early > without putting the folios back to the LRU. > > Callers then discard the list head while those folios remain isolated with > an extra reference taken by folio_isolate_lru(). The pages stay off the > LRU for as long as the mapping exists (anon active+inactive counts drop > while RSS does not), and the leftover references can pin the pages after > the mapping is gone. > > Put the folios back on the invalid-nid path so ignored migration requests > still return them to the LRU. > > Fixes: 7e6c3130690a ("mm/damon/ops-common: ignore migration request to invalid nodes") > Cc: <stable@vger.kernel.org> > Assisted-by: Cursor:grok-4.5 > Signed-off-by: liyouhong <liyouhong@kylinos.cn> > > --- > v2: > - Drop the putback helper for easier stable backport > - Open-code putback only on the invalid-nid path > - Keep the original indentation and Cc stable@ > - Add a separate cleanup as 2/2 (factor out damon_putback_folio_list) > > --- > mm/damon/ops-common.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c > index d1842e2b00ef..f5ded45fabd1 100644 > --- a/mm/damon/ops-common.c > +++ b/mm/damon/ops-common.c > @@ -394,8 +394,15 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) > return nr_migrated; > > if (target_nid < 0 || target_nid >= MAX_NUMNODES || > - !node_state(target_nid, N_MEMORY)) > + !node_state(target_nid, N_MEMORY)) { > + while (!list_empty(folio_list)) { > + struct folio *folio = lru_to_folio(folio_list); > + > + list_del(&folio->lru); > + folio_putback_lru(folio); > + } > return nr_migrated; > + } As I replied to the second patch, I'd suggest doing putback just before returning. Then this invalid target_nid handling can 'goto' there. Thanks, SJ [...] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid 2026-07-24 14:41 ` SJ Park @ 2026-07-24 15:56 ` SJ Park 0 siblings, 0 replies; 9+ messages in thread From: SJ Park @ 2026-07-24 15:56 UTC (permalink / raw) To: SJ Park; +Cc: dayou5941, akpm, damon, liyouhong, stable On Fri, 24 Jul 2026 07:41:46 -0700 SJ Park <sj@kernel.org> wrote: > On Fri, 24 Jul 2026 14:01:34 +0800 dayou5941@163.com wrote: > > > From: liyouhong <liyouhong@kylinos.cn> > > > > damon_pa_migrate() and damos_va_migrate() isolate folios into a local list > > and then call damon_migrate_pages(). When target_nid is invalid (including > > the scheme default NUMA_NO_NODE / -1), damon_migrate_pages() returns early > > without putting the folios back to the LRU. > > > > Callers then discard the list head while those folios remain isolated with > > an extra reference taken by folio_isolate_lru(). The pages stay off the > > LRU for as long as the mapping exists (anon active+inactive counts drop > > while RSS does not), and the leftover references can pin the pages after > > the mapping is gone. > > > > Put the folios back on the invalid-nid path so ignored migration requests > > still return them to the LRU. > > > > Fixes: 7e6c3130690a ("mm/damon/ops-common: ignore migration request to invalid nodes") > > Cc: <stable@vger.kernel.org> > > Assisted-by: Cursor:grok-4.5 > > Signed-off-by: liyouhong <liyouhong@kylinos.cn> > > > > --- > > v2: > > - Drop the putback helper for easier stable backport > > - Open-code putback only on the invalid-nid path > > - Keep the original indentation and Cc stable@ > > - Add a separate cleanup as 2/2 (factor out damon_putback_folio_list) > > > > --- > > mm/damon/ops-common.c | 9 ++++++++- > > 1 file changed, 8 insertions(+), 1 deletion(-) > > > > diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c > > index d1842e2b00ef..f5ded45fabd1 100644 > > --- a/mm/damon/ops-common.c > > +++ b/mm/damon/ops-common.c > > @@ -394,8 +394,15 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid) > > return nr_migrated; > > > > if (target_nid < 0 || target_nid >= MAX_NUMNODES || > > - !node_state(target_nid, N_MEMORY)) > > + !node_state(target_nid, N_MEMORY)) { > > + while (!list_empty(folio_list)) { > > + struct folio *folio = lru_to_folio(folio_list); > > + > > + list_del(&folio->lru); > > + folio_putback_lru(folio); > > + } > > return nr_migrated; > > + } > > As I replied to the second patch, I'd suggest doing putback just before > returning. Then this invalid target_nid handling can 'goto' there. I now think that is a bad idea. Sorry for confusing. That will make readers assume damon_migrate_folio_list() doesn't putback folios. Please resend this as-is, but without the second patch. Thanks, SJ [...] ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-07-24 15:56 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-24 6:01 [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid dayou5941 2026-07-24 6:01 ` [PATCH v2 2/2] mm/damon/ops-common: factor out damon_putback_folio_list() dayou5941 2026-07-24 6:07 ` sashiko-bot 2026-07-24 14:39 ` SJ Park 2026-07-24 14:56 ` SJ Park 2026-07-24 14:26 ` [PATCH v2 1/2] mm/damon/ops-common: putback folios on invalid migrate nid SJ Park 2026-07-24 14:30 ` SJ Park 2026-07-24 14:41 ` SJ Park 2026-07-24 15:56 ` SJ Park
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox