v1
2026-08-27
CMA分配按memcg记账 · v1
为 CMA 分配添加 memcg 统计:新增 memory_cma_accounting 选项及 charge/uncharge,按 CMA 区域计数并在 cgroupfs 暴露。
原始补丁链接
子 Patch(11)
1/11
mm/cma: drop const for struct page on release API
去掉 cma_release/cma_release_frozen 参数上的 const struct page *,因为内部会经 pfn 往返并调用 put_page_testzero/free_contig_range_common 实际修改页面,const 并未被遵守。
2/11
mm/cma: include linux/cma.h in cma.h
mm/cma.h 需要使用 linux/cma.h 中的 MAX_CMA_AREAS、CMA_MAX_NAME 等定义,因此直接包含 linux/cma.h,显式化依赖并移除各 .c 文件中多余的同类包含。
3/11
cgroup: add memory_cma_accounting mount option
新增 cgroup v2 挂载选项 memory_cma_accounting,用于后续开启 memcg 下的 CMA 内存统计;默认不开启,避免改变现有内存计费语义和用户预期。
4/11
memcg: add cma charge/uncharge functions for area counters
实现 mem_cgroup_charge_cma/uncharge_cma:按 cma_area_count 在 memcg 分配每 CMA 区页计数器,普通页标记对应 folio 的 obj_cgroup,大 folio 只标首页,释放时按 folio 大小冲销两级计数。
5/11
mm/cma: charge cma allocation to memcg per area counters
在 __cma_alloc_frozen 分配成功后调用 mem_cgroup_charge_cma 计入当前任务 cgroup,若计费失败则释放页面;在 __cma_release_frozen 中对应调用 mem_cgroup_uncharge_cma。
6/11
memcg: register per-area usage counters in cgroupfs
在非根 cgroup 下按每个 CMA 区注册 memory.cma..{current,max} 文件,current 报告当前使用量,max 为可写上限,默认 max;cftype 名称取自 CMA 区名。
7/11
selftests: cgroup: add cma configs for cgroup selftest suite
为 cgroup selftest 配置启用 CMA 和 dma-buf CMA heap,使后续 memcg CMA 测试可通过 /dev/dma_heap/default_cma_region 分配 CMA 页面并验证计费逻辑。
8/11
selftests: cgroup: add memcg cma tests
新增 test_cma_memcg:用 dma-buf CMA heap 分配/释放 4MB 验证 memory.cma.reserved.current 增减;设置 max=2MB 后尝试 4MB 分配应失败;未启用 memory_cma_accounting 时跳过测试。
9/11
selftests: cgroup: add a vmtest script for memcg
新增 vmtest-memcg.sh,采用 virtme-ng 启动带 cma=64M 的 VM,开启 memory_cma_accounting 后运行 memcg 测试,并支持 -b 编译、-q 指定 qemu、-s 进 shell、-v 输出启动日志。
10/11
selftests: cgroup: add memcg hugetlb_cma tests
扩展 test_cma_memcg.c 增加 hugetlb_cma 用例:通过 nr_hugepages 获取 hugepage 验证 memory.cma.hugetlb0.current 随之增减,以及设置 max=0 后分配 hugepage 失败。
11/11
selftests: cgroup: amend vmtest-memcg to run the hugetlb cma tests
在 selftest config 加入 HUGETLBFS,vmtest-memcg 脚本增加 hugetlb_cma=1G 与 hugetlb_cma_only=1 参数,并将 qemu 内存提高到 3G 以保证 CMA 预留能成功。