快层节点
DRAM
HOT 提升
COLD 降级
慢层节点
如 CXL 内存
DAMOS_MIGRATE_HOT 提升热页到快层,DAMOS_MIGRATE_COLD 降级冷页到慢层
迁移走 migrate_pages(),目标节点经 migration target control 的 nid 字段传给 alloc_migration_target()
alloc_migration_target() 只在 __GFP_THISNODE 置位时把 nid 当硬约束
否则它只是个偏好
偏好与硬约束之间,隔着一次静默回退
没有 __GFP_THISNODE
nid 只是偏好
目标节点紧张就回退到别的节点
而且不唤醒 kswapd
置位 __GFP_THISNODE
nid 是硬约束
分配不到就如实失败
不会静默落到别的节点
DAMON 的迁移目标,走的是前一条
回退不带任何提示
调用者只看到「迁移完成」,看不到页最终落在哪个节点
DAMOS 提升热页到快层节点
migrate_pages() 照着 nid 分配目标页
快层紧张时分配回退到慢层
页没换层:快层没多一页,慢层也没少一页
tracepoint 与 sz_applied 仍报成功
调用者以为这次提升成立了
回退、没换层、还报成功:三次静默
热页只挪了物理位置,没有换层
快层没多一页,慢层也没少一页
mm_migrate_pages tracepoint 与 sz_applied 仍报成功
失效完全不可见
并行跑降级 scheme 也救不回
降级跟不上提升速率时,照样回退
统计说提升成功,快层却一页没多
给 DAMON 的迁移目标分配加上 __GFP_THISNODE
目标节点从偏好变成硬约束
.gfp_mask = (GFP_HIGHUSER_MOVABLE & ~__GFP_RECLAIM) |
-__GFP_NOMEMALLOC | GFP_NOWAIT,
+__GFP_NOMEMALLOC | GFP_NOWAIT | __GFP_THISNODE,
分配失败就如实报失败
不再静默落到别的节点
页面要么真的到了目标节点,要么这次迁移明确失败
目标节点分配变硬约束
成功
页真正换层
快层多一页,慢层少一页
失败
如实上报,统计不再虚报
失效可见,可被诊断
既有路径都这么写
alloc_misplaced_dst_folio()
alloc_demote_folio()
do_move_pages_to_node()
所以这不是新发明,是把 DAMON 补齐
失败如实上报
提升与降级不再静默空转
热页不会被假装搬到快层
统计恢复真实
sz_applied 与 tracepoint 不再虚报
失效场景可诊断
迁移目标从「尽量去」变成「必须去」
失败可见之后,操作者可据此调整水位或降级速率来配合提升
分层内存的热页提升不再静默空转
作者未提供性能数据,以上为代码逻辑推断的预期收益
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x