【环境信息】
环境信息:arm物理机 TaiShan 2280 V2
OS版本:21.03
【问题复现步骤】
1.安装最小化
2.安装成功进入系统查看dmesg日志
【预期结果】
无异常报错
【实际结果】
结论:cma预留内存不足,导致申请失败;
1、系统启动后cma预留大小为512M(524288K cma-reserved)
2、日志在4.527402s打印有cma大小为384M(free_cma:6144),说明cma的内存一直在申请;
3、日志在17.697227s打印cma分配失败,返回值-12表示ENOMEM,没有内存了
结论:cma预留内存不足,导致申请失败;
1、系统启动后cma预留大小为512M(524288K cma-reserved)
2、日志在4.527402s打印有cma大小为384M(free_cma:6144),说明cma的内存一直在申请;
3、日志在17.697227s打印cma分配失败,返回值-12表示ENOMEM,没有内存了
@Jing Xiangfeng
有其它服务或进程在使用CMA内存?
出现内存不足时,对哪些功能会产生影响呢?
@Jing Xiangfeng
有其它服务或进程在使用CMA内存?
出现内存不足时,对哪些功能会产生影响呢?
CMA应该是给驱动使用;如果在CMA申请不到,一般会fallback到伙伴系统申请;
1.默认配置CONFIG_CMA_SIZE_SEL_MBYTES=64,但由于512M对齐原因,所以最终预留内存为512M;
2.由于CONFIG_ZONE_DMA32=y,预留的512M内存在4G以下预留,若预留的512M用完则会fallback到伙伴系统中分配连续的页给申请者(如问题中的hinic驱动),但由于走到cma_alloc再fallback到伙伴系统,所以每次cma_alloc分配不出都还会报cma分配失败,但最终内存是得到分配的。
3.由于512M对齐原因(64K_PAGE_SIZE), 512M若用完再预留就需要直接预留1G, 而4G以下鲜有连续1G CMA内存,所以4G以下预留1G cma内存可能会失败。
4.如要预留1G以上cma内存,则需要将CONFIG_ZONE_DMA32=n,但不建议,CONFIG_ZONE_DMA32=n影响兼容性(如kdump,驱动DMA32兼容性等)。
Sign in to comment