Linux系统中频繁打印cma_alloc_failed

描述:arm服务器安装操作系统后,OS启动时频繁打印cma_alloc_failed报错。

 问题分析

“cma:cma_alloc:alloc failed,req-size:  2 pages, ret: -12”是内核中CMA机制的一种错误信息,提示CMA分配内存失败。其中的返回值“-12”代表ENOMEM,即内存不足或者内存分配失败的错误码。可能原因如下

查看cma预留内存情况,调整cma大小

dmesg | grep cma  # 检查启动时的CMA配置
cat /proc/meminfo | grep cma  # 查看CMA总大小和剩余情况

可以通过修改内核启动参数(如Grub配置),增加CMA预留内存(例如设置为512MB):

cma=nn[MG]@[start[MG][-end[MG]]]
        [KNL,CMA,EARLY]
        Sets the size of kernel global memory area for
        contiguous memory allocations and optionally the
        placement constraint by the physical address range of
        memory allocations. A value of 0 disables CMA
        altogether. For more information, see
        kernel/dma/contiguous.c

vim /etc/default/grub  # 在 GRUB_CMDLINE_LINUX 行添加 cma=512M
GRUB_CMDLINE_LINUX="... cma=512M"

如果上面配置后没有效果的话,请检查bios 中smmu是否开启

SMMU  (System Memory Management Unit)是IO设备与总线桥之间的一个地址转换桥,可以实现虚拟地址到物理地址的转换,同时还可以对内存访问进行权限控制和缓存管理,确保系统内存的安全和高效使用。

注: arm架构需要开启SMMU ,而smmu配置会影响 CMA 区域的使用情况。不同厂家叫法不一样,但功能是一样的,下面是我整理的三种不同的叫法

MMU是memory manage unit 内存管理单元;

ARM服务器: SMMU是system memory manage unit 系统内存管理单元;

x86服务器:IOMMU是i/o memory management unit 和SMMU的功能一样

 

posted @ 2025-05-17 07:41  杨灏  阅读(845)  评论(0)    收藏  举报