Linux 5.15.68中CMA预留区域显示0KB问题排查求助
问题:CMA预留区域显示为0KB的排查与解决
环境与配置详情
测试环境:Linux 5.15.68,QEMU ARM64虚拟机,1GB内存(地址范围0x80000000 ~ 0xbfffffff),计划将3/4内存(768MB)分配给CMA区域,1/8(128MB)分配给设备驱动。
设备树/reserved-memory节点配置:
reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; axpu_reserved_mem: axpursvd@90000000 { no-map; reg = <0x0 0xc0000000 0x0 0x8000000>; }; linux,cma { compatible = "shared-dma-pool"; reusable; size = <0 0x30000000>; alloc-ranges = <0 0x90000000 0 0x30000000>; linux,cma-default; }; };
启动异常日志
系统启动时内存信息显示CMA预留为0KB:
Memory: 1020140K/1048576K available (3200K kernel code, 386K rwdata, 808K rodata, 7808K init, 106K bss, 28436K reserved, 0K cma-reserved)
已配置的内核参数
CONFIG_MEMORY_ISOLATION=y CONFIG_CONTIG_ALLOC=y CONFIG_CMA=y CONFIG_CMA_DEBUG=y CONFIG_CMA_DEBUGFS=y CONFIG_CMA_SYSFS=y CONFIG_CMA_AREAS=7 # CONFIG_DMA_CMA is not set
已尝试操作
- 在启动参数中添加
cma=768MB - 修改
CONFIG_CMA_AREAS为1
上述操作均未解决问题。
问题根源与解决方案
1. 缺失核心依赖配置:CONFIG_DMA_CMA
ARM64架构下,内核解析设备树中的linux,cma节点依赖CONFIG_DMA_CMA选项启用。当前配置中该选项被注释,导致内核完全忽略设备树里的CMA配置,这是CMA预留显示为0KB的核心原因。
解决:
将内核配置中的# CONFIG_DMA_CMA is not set修改为:
CONFIG_DMA_CMA=y
2. 设备树中无效的预留内存区域
设备树里axpu_reserved_mem的reg配置<0x0 0xc0000000 0x0 0x8000000>指向的地址0xc0000000超出了虚拟机的内存范围(最大到0xbfffffff),这部分预留内存无效,还会干扰内核对reserved内存的统计。
解决:
修正axpu_reserved_mem的reg为有效内存范围内的地址,比如分配128MB的话:
axpu_reserved_mem: axpursvd@b0000000 { no-map; reg = <0x0 0xb0000000 0x0 0x10000000>; };
3. 其他验证点
- 确保
alloc-ranges配置的地址范围完全落在虚拟机可用内存内:当前0x90000000 ~ 0xc0000000实际对应可用内存的0x90000000 ~ 0xbfffffff(刚好768MB),这部分配置正确,无需修改。 - 设备树中
linux,cma-default标记已设置,确保该CMA区域作为默认区域启用,无需额外配置CONFIG_CMA_DEFAULT_ON。
完成以上修改后,重新编译内核和设备树,启动虚拟机即可看到CMA预留区域正常统计。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

