v3 2026-10-28

dma-buf 的 memcg 记账与转移 · v3

为 dma-buf 增加 memcg 计费,经 dma-heap、LSM 钩子与 IOCTL 支持充电和转移。

原始补丁链接

子 Patch(8)

1/8
memcg: Add MEMCG_DMABUF accounting infrastructure
引入 MEMCG_DMABUF 与 dma-buf memcg 辅助,在 dma_buf->memcg 按 PAGE_ALIGN(size) 记账,释放统一 uncharge;使计费脱离页分配器,免传 __GFP_ACCOUNT,并支持跨 cgroup 转移。
2/8
dma-heap: charge dma-buf memory via explicit memcg
在 dma_heap_allocation_data 增加 charge_fd,DMA_HEAP_IOCTL_ALLOC 由 pidfd/cgroupfd 解析目标 memcg,在 dma_heap_ioctl_allocate 中 reserve/commit;未指定且启用 mem_accounting 时记到分配者 cgroup,解决代分配归属。
3/8
security: dma-buf: Add dma_buf_charge_task LSM hook
新增 security_dma_buf_charge_task,在 mem_cgroup_get_from_fd 解析他进程 pidfd 时传入分配者与目标凭据,供 LSM 管控跨 cgroup 归属;无 SECURITY 时内联返回 0,防止任意耗尽目标 cgroup。
4/8
security: dma-buf: Add dma_buf_charge_cgroup LSM hook
新增 security_dma_buf_charge_cgroup,在 mem_cgroup_get_from_fd 解析 cgroupfd 时把请求者 cred 和目标 cgrp 交给 LSM,建立跨 cgroup dma-buf 计费管控点;无 SECURITY 时内联返回 0。
5/8
selinux: Restrict cross-cgroup dma-buf charging
实现 selinux_dma_buf_charge_task,用 avc_has_perm 检查 dma_buf 类的 charge_task 权限,按分配者与目标进程 SID 决定能否跨 cgroup 计费;无策略时不再允许任意域耗尽他组。
6/8
selinux: Restrict dma-buf direct cgroup charging
实现 selinux_dma_buf_charge_cgroup,用 avc_has_perm 检查 dma_buf 类的 charge_cgroup 权限,目标 SID 取 cgroup kernfs 标签;未标注 cgroup 按 fail-open 处理,限制任意域向任意 cgroup 计费。
7/8
dma-buf: transfer memcg charges via DMA_BUF_IOCTL_XFER_CHARGE
新增 DMA_BUF_IOCTL_XFER_CHARGE,按 charge_fd 转移已分配 dma-buf 的 memcg 计费;先记新再退旧,失败保留原计费,用 dmabuf->memcg 的 cmpxchg 防并发;仅 memcg_account 导出者支持,否则返回 EOPNOTSUPP。
8/8
selftests/dmabuf-heaps: Add dma-buf memcg accounting tests
新增 charge_fd 自测与 test_memcg_dmabuf:父进程取子 cgroup 进程 pidfd,经 DMA_HEAP_IOCTL_ALLOC 分配后检查 memory.stat 的 dmabuf;不支持或缺少 system heap 时跳过,并加 vmtest.sh 编排。