mm/damon: adjust isolated pages stat for DAMOS_MIGRATE_{HOT,COLD}
Subsystems (3)
SJ Park
maintainerPATCH 1/1 mm/damon: adjust isolated pages stat for DAMOS_MIGRATE_{HOT,COLD}
Callers of migrate_pages() should adjust NR_MIGRATED_{ANON,FILE} for isolations and putback of the folios. That for migration succeeded folios is done by migrate_pages(), in migrate_folio_done(). That for MR_DEMOTION reason is an exception though.
DAMOS_MIGRATE_{HOT,COLD} call migrate_pages() but mistakenly not doing the stat adjustment. As a result, use of DAMOS_MIGRATE_{HOT,COLD} could corrupt the stat. It could confuse too_many_isolated(), make compaction and reclaim to behave in unexpected ways. The stat corruption can be reproduced and confirmed using DAMON user-space tool [1] on NUMA systems, like below.
$ numactl --hardware
available: 2 nodes (0-1)
[...]
$ sudo ./damo start --damos_action migrate_hot 1
$ sudo cat /proc/sys/vm/stat_refresh
$ sudo dmesg
[...]
[ 80.215554] vmstat_refresh: nr_isolated_anon -5578
[ 80.216842] vmstat_refresh: nr_isolated_file -34400This issue was discovered [2] by Sashiko.
[1] https://github.com/damonitor/damo
[2] https://lore.kernel.org/[email protected]
---
Changes from RFC:
- RFC: https://lore.kernel.org/[email protected]
- Rebase to the latest mm-new.
- Drop RFC tag.
mm/damon/ops-common.c | 4 ++++ mm/damon/paddr.c | 2 ++ mm/damon/vaddr.c | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-)
mm/damon/ops-common.c +4 -0
@@ -374,6 +374,8 @@ static unsigned int damon_migrate_folio_list(struct list_head *folio_list,while (!list_empty (folio_list)) { folio =lru_to_folio (folio_list);list_del (&folio->lru); +node_stat_sub_folio (folio,NR_ISOLATED_ANON + +folio_is_file_lru (folio));folio_putback_lru (folio); }
@@ -396,6 +398,8 @@ unsigned long damon_migrate_pages(struct list_head *folio_list, int target_nid)struct folio *folio =lru_to_folio (folio_list);list_del (&folio->lru); +node_stat_sub_folio (folio,NR_ISOLATED_ANON + +folio_is_file_lru (folio));folio_putback_lru (folio); }return nr_migrated;
mm/damon/paddr.c +2 -0
@@ -346,6 +346,8 @@ static unsigned long damon_pa_migrate(struct damon_region *r,if (!folio_isolate_lru (folio)) goto put_folio; +node_stat_add_folio (folio,NR_ISOLATED_ANON + +folio_is_file_lru (folio));list_add (&folio->lru, &folio_list); put_folio: addr +=folio_size (folio);
mm/damon/vaddr.c +2 -1
@@ -627,7 +627,8 @@ static void damos_va_migrate_dests_add(struct folio *folio, isolate:if (!folio_isolate_lru (folio))return ; - +node_stat_add_folio (folio,NR_ISOLATED_ANON + +folio_is_file_lru (folio));list_add (&folio->lru, &migration_lists[i]); }
base-commit: 53f9deb696041883ca3d03b33b565e4cd3ba54dd
Signature · 1 line
2.47.3