v3 2026-08-08

引入分层内存 cgroup 限制 · v3

为 memcg 增加 tiered limits,分别限制 cgroup 在 HBM/DRAM/CXL/PMEM 等层级的占用,保障内存放置与性能隔离。

原始补丁链接

子 Patch(14)

1/14
mm/memcontrol: Introduce cgroup.memory=tiered_limits boot parameter
为 cgroup.memory= 新增 tiered_limits 选项以启用按内存层级比例缩放/执行 memory.{min,low,high};用 static key 避免未启用时热路径开销;仅 boot-time,cgroup v1 不兼容并告警。
2/14
mm/memcontrol: Refactor page_counter charging in try_charge_memcg
重构 try_charge_memcg() 中 page_counter 计费代码,理清 memcg v1/v2 分支,为后续增加 toptier page_counter 的 charging/uncharging 做准备;无功能变化。
3/14
mm/memory-tiers: Introduce a mapping from nid to tier_slot
在 memory-tiers 中新增 nid 到 tier_slot 的固定稠密映射,避免 tier_ids 稀疏且在热插拔后变化;同时提供获取 tier 对应 nodemask 的辅助函数,供启动时 per-tier 统计。
4/14
mm/memcontrol: Allocate per-tier page_counters
为 memcg 分配按 tier 的 page_counter 数组 memcg->tier(大小为 nr_node_ids),仅在启用 tiered limits 时分配避免开销;在 css_alloc 初始化并父链接,__mem_cgroup_free 释放。
5/14
mm/memcontrol: Set tier limits proportional to memory limits
当用户写入 memory 限制或热插拔改变 tier 比例时,按各 tier 内存占比重新计算 memcg->tier 各层 page_counter 的 proportional 限制;仅在启用 tiered_limits 时生效。
6/14
mm/vmscan, memcontrol: Add nodemask to try_to_free_mem_cgroup_pages
给 try_to_free_mem_cgroup_pages() 增加 nodemask 参数,允许未来在 toptier 超限但 memcg 总限制未超时只对特定节点/tier 执行回收。
7/14
mm/memcontrol: Charge/uncharge tiered memory to mem_cgroup
在 try_charge_memcg() 增加 nid 参数并同时计入 memcg->tier[slot];uncharge 按 tier 批量,遇跨 tier folio 先冲刷前一批次;migrate/replace 时转移 tier 电荷;目前仅覆盖 LRU folio。
8/14
mm/memcontrol: Make memory.low and memory.min tier-aware
让 memory.{low,min} 支持 tier-aware:在 vmscan 判断 protection 时结合 per-tier 计数器,按层级比例施加最低/尽力保护,避免高 tier 内存被其他负载挤占;未启用时无行为变化。
9/14
mm/memcontrol: Make memory.high tier-aware
让 memory.high 支持 tier-aware:memory.high 全局超限时所有 tier 都回收;仅某 tier 超限时只定向回收该 tier 节点,从而避免高 tier 内存被无关负载抢占;默认关闭无影响。
10/14
mm/memcontrol: Make memory.max tier-aware
memory.max 变为 tier-aware:folio 除计入 memory/memsw 外还计入所在 tier 的 page_counter,tier 超限时只回收到该 tier;失败后通过 tier_counter_mem_cgroup() 沿层级链找 owner;margin/OOM 检查按失败 tier 计算。
11/14
mm/memcontrol, migrate: Transfer tier charge on migration
跨 tier 迁移虽 memcg 总电荷不变但 tier 电荷变化,故在 migrate_folio_unmap 中单独对目标 folio 做 tier charge;硬限超限尝试一次 reclaim,仍不够则返回 -EBUSY 失败迁移,避免 OOM/split。
12/14
mm/memcontrol: Kick async reclaim on migration and folio replacement
对于强制 charge 和 folio replacement/hugetlb/hotplug 等无法同步回收的路径,在迁移/替换后若 per-tier 超限则发起异步回收(soft limit),避免内存滞留高 tier;未启用 tiered limits 时无操作。
13/14
mm/memcontrol, sched/numa: Gate NUMA promotions into memcg tiers
在 should_numa_migrate_memory() 中增加 memcg tier 是否满的检查,若目标 tier 已无 headroom 则不放过节流的 NUMA promotion;未启用 tiered limits 时行为不变。
14/14
mm/page_alloc: steer allocations away from exhausted memory tiers
page allocator 在快路径用 tier headroom nodemask 引导首次分配,避免分配在已满 tier 后立刻回收;仅作用于 MIGRATE_MOVABLE,交集为空或无法满足时回退调用者 nodemask 并触发正常 reclaim。