背景

分层内存系统里,DAMON 的 DAMOS_MIGRATE_HOT/COLD 动作负责把热页提升到快层节点、把冷页降级到慢层(如 CXL 内存)。迁移走 migrate_pages(),目标节点经 migration target control 的 nid 字段传给 alloc_migration_target()。

但 alloc_migration_target() 只在 __GFP_THISNODE 置位时把 nid 当硬约束,否则它只是个偏好:目标节点紧张时,分配器回退到其他节点,而且不唤醒 kswapd。

回退静默失效链
┌────────────────────────────────────┐
│      DAMOS 提升热页到快层节点      │
└─────────────────┬──────────────────┘
                  ▼
┌────────────────────────────────────┐
│ 快层紧张时分配回退到慢层,页没换层 │
└─────────────────┬──────────────────┘
                  ▼
┌────────────────────────────────────┐
│ tracepoint 与 sz_applied 仍报成功  │
└────────────────────────────────────┘

问题

  • 快层节点紧张时分配回退到慢层,热页只挪了物理位置,没有换层
  • mm_migrate_pages tracepoint 与 DAMOS 的 sz_applied 统计仍报成功,失效不可见
  • 并行跑降级 scheme 也救不回:降级跟不上提升速率时照样回退

方案

给 DAMON 的迁移目标分配加上 __GFP_THISNODE,目标节点从偏好变成硬约束:分配失败就如实报失败,不再静默落到别的节点。

    .gfp_mask = (GFP_HIGHUSER_MOVABLE & ~__GFP_RECLAIM) |
-       __GFP_NOMEMALLOC | GFP_NOWAIT,
+       __GFP_NOMEMALLOC | GFP_NOWAIT | __GFP_THISNODE,
加 __GFP_THISNODE 后成败分明
             ┌──────────────────────┐
             │ 目标节点分配变硬约束 │
             └──────────┬───────────┘
         ┌──────────────┴──────────────┐
         ▼                             ▼
┌──────────────────┐     ┌────────────────────────────┐
│ 成功则页真正换层 │     │ 失败如实上报,统计不再虚报 │
└──────────────────┘     └────────────────────────────┘

这与既有做法一致:alloc_misplaced_dst_folio()、alloc_demote_folio() 与 do_move_pages_to_node() 这些显式指定目标节点的迁移路径,用的都是 __GFP_THISNODE。

收益

作者未提供性能数据,从代码逻辑推断的预期收益:

  • 提升与降级失败如实上报,分层内存的热页提升不再静默空转
  • sz_applied 与 tracepoint 统计恢复真实,失效场景可诊断
  • 失败可见之后,操作者可据此调整水位或降级速率来配合提升