Re: [PATCH] mm/damon/ops-common: putback folios on invalid migrate nid

[email protected] Thu, 23 Jul 2026 06:24:27 +0000
Newsgroups dev.linux.lists.damon
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

Pre-existing issues:
- [High] Incorrect Loop Advancement / Bounds Oversight (PFN advancement bug)
- [High] Missing yield in unbounded list putback loop
--

--- Patch [1]: [PATCH] mm/damon/ops-common: putback folios on invalid migrate nid ---
commit b4aa488aeb8640931363ab9a919f2ae6536d57ba
Author: liyouhong <[email protected]>
mm/damon/ops-common: putback folios on invalid migrate nid

This commit extracts the LRU putback logic into a helper function and
uses it to return folios to the LRU when damon_migrate_pages() is called
with an invalid target_nid. This prevents folios from remaining isolated
from the LRU permanently.

> diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c
> index e59f77eca83b2..1286fe54b0d9d 100644
> --- a/mm/damon/ops-common.c
> +++ b/mm/damon/ops-common.c
> @@ -330,12 +330,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);
> +	}
> +}

[Severity: High]
This is a pre-existing issue, but can this tight loop cause CPU soft lockups?

If a DAMON scheme isolates a massive region that fails to migrate, or is
given an invalid migration NID, the isolated folio list could scale to
millions of folios. Because this loop takes the LRU lock for each folio
without a yield point, could it monopolize the CPU and cause severe latency
spikes? Should there be a cond_resched() in this loop?

[ ... ]

[Severity: High]
This is a pre-existing issue, but do these unconditionally sized advancements
elsewhere in the DAMON codebase risk skipping uninspected memory regions?

In mm/damon/paddr.c:damon_pa_pageout():

    addr += folio_size(folio);

And similarly in mm/damon/vaddr.c:damos_va_migrate_pmd_entry() and
damos_va_stat_pmd_entry():

    nr = folio_nr_pages(folio);

When a DAMON region starts in the middle of a large folio (a tail page), or
a PTE walk encounters a partially mapped large folio, advancing the pointer
by the total folio size or total number of pages overshoots the bounds. Does
this silently skip adjacent, unrelated PTEs and physical addresses?

-- 
Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=1