/ 详情

dmesg日志中报cma: Failed to reserve 512MiB 以及pci设备Failed to assign [mem size 0xxx]错误

Done
Task
Opened this issue  
2020-06-17 11:20

问题现象:
dmesg日志中报cmd: Failed to reserve 512MiB 以及pci设备Failed to assign [mem size 0xxx]错误

期待结果:
无此报错

Attachments
Alex_Chao 2020-06-17 11:19

Comments (7)

Alex_Chao created任务
Alex_Chao set related repository to openEuler/kernel
展开全部操作日志

Hey @Alex_Chao , Welcome to openEuler Community.
All of the projects in openEuler Community are maintained by @openeuler-ci-bot .
That means the developers can comment below every pull request or issue to trigger Bot Commands.
Please follow instructions at https://gitee.com/openeuler/community/blob/master/en/sig-infrastructure/command.md to find the details.

Alex_Chao set assignee to Alex_Chao
Alex_Chao assigned collaborator wangxiongfeng
Alex_Chao changed title
Alex_Chao changed description

是不是资源不够了,是否有详细的测试场景?

XieXiuQi added
 
question
label

CMA是需要连续的物理地址,当4G以下没有足够连续的物理地址时,就会出现CMA不够的日志,可以预留小一些

CMA是需要连续的物理地址,当4G以下没有足够连续的物理地址时,就会出现CMA不够的日志,可以预留小一些

所以这个不是问题。如果外设DMA需要更多的内存,可以使能SMMU,通过SMMU地址翻译来解决这个问题,此时的地址不需要物理地址连续。

PCI设备,有见到PCI设备的驱动加载失败吗?

一、关于CMA相关报错:
1、此问题当前无解决方案,因为0-4GB的物理地址空间中,只有1MB-2GB的物理地址空间映射到了系统内存,其他系统内存都映射到了高地址空间(4GB以上),而2GB-4GB的地址空间分配给了外设,而1MB-2GB的物理地址空间并没有512MB连续的内存可分配给CMA,因此才会出现cma:Failed to reserve 512 MiB。

2、当前的物理地址分配情况是由BIOS决定的,如需要分配CMA成功,则需要BIOS将2GB-4GB的物理地址映射到物理内存。

3、X86上2GB-4GB地址就是留给物理内存的因此不存在这一大类问题,另外一些操作系统没有这个报错是因为并没有去做申请512MB连续内存的动作。

二、bar空间申请报错也是类似的原因,可以查看下/proc/iomem文件,与上述cma相关问题类似地,1MB-2GB的物理地址空间中无法提供外设申请的物理地址资源,但是实际上外设最终应能申请到2GB以上的空间。看了下PCI设备的bus id,在Taishan服务器上是1822网卡设备,后续会联系网卡驱动相关开发人员处理。

补充说明:
1、经过分析,发现cma=函数调节没用,因为alignment值是0x2000,0000,即512MB对齐,因此size最低也为512MB,内核配置CONFIG_CMA_SIZE_MBYTES=64,但是实际上没用。
2、由于配置了CONFIG_ZONE_DMA32=y,因此cma分配地址的限制是0x10000,0000,即分配CMA的物理地址不能超过4GB
3、综上所述,当前内核配置最低cma分配的大小是512MB,并且要和0x2000,0000地址对齐,分配的地址范围是0-4GB,即要在物理地址0-4GB的地址范围内寻找512MB连续的物理内存,并且要和0x2000,0000地址对齐。
4、当前内存布局无法满足需求,查询/proc/iomem发现映射System RAM的空间如下,在4GB空间内只有1MB-2GB地址空间映射给了内存,内存预留的顺序是Crash kernel内存先预留,然后才到CMA,但是从下面的信息看,Crashkernel的内存预留已经到了2GB的边界,因此已经没有足够的内存预留给CMA,所以导致CMA预留512MB失败。
第一部分:(1M-2GB)
00010000-1fe2ffff : System RAM
00080000-00deffff : Kernel code
00df0000-0123ffff : reserved
01240000-0173ffff : Kernel data
1cbd0000-1e1fffff : reserved
1f8d0000-1f8effff : reserved
1fdb0000-1fe2ffff : reserved
1fe30000-2001ffff : reserved
20020000-2002ffff : System RAM
20020000-2002ffff : reserved
20030000-2003ffff : reserved
20040000-2004ffff : System RAM
20040000-2004ffff : reserved
20050000-2012ffff : reserved
20130000-2017ffff : System RAM
20180000-2021ffff : reserved
20220000-2023ffff : System RAM
20240000-2037ffff : reserved
20380000-2043ffff : System RAM
20420000-2043ffff : reserved
20440000-2046ffff : reserved
20450000-2045ffff : reserved
20470000-2047ffff : System RAM
20470000-2047ffff : reserved
20480000-2048ffff : reserved
20490000-2049ffff : System RAM
20490000-2049ffff : reserved
204a0000-204affff : reserved
204b0000-204cffff : System RAM
204d0000-204fffff : reserved
204f0000-204fffff : reserved
20500000-2057ffff : System RAM
20540000-2057ffff : reserved
20580000-2081ffff : reserved
20820000-2fbcffff : System RAM
23d50000-23d5ffff : reserved
23d90000-23d9ffff : reserved
2fbd0000-2fbfffff : reserved
2fc00000-3fbfffff : System RAM
40000000-43ffffff : reserved
44030000-4fffffff : reserved
50000000-7fffffff : System RAM
6bff0000-6fffffff : reserved
70000000-7fffffff : Crash kernel
第二部分:(130GB-144GB,总共14GB)
2080000000-23ffffffff : System RAM
21fffd0000-2200fdffff : reserved
23ff9e0000-23fffdffff : reserved
23fffe0000-23ffffffff : reserved
第三部分:(总共16GB)
202000000000-2023ffffffff : System RAM
20219bc00000-20219cbfffff : reserved
20239bc00000-20239bc0ffff : reserved
2023bf8e0000-2023bfffffff : reserved
2023c0000000-2023ffffffff : Crash kernel

Alex_Chao changed issue state from 待办的 to 已完成

Sign in to comment

状态
Assignees
Projects
Milestones
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
Branches
Planed to start   -   Planed to end
-
Top level
Priority
Duration (hours)
确定
参与者(5)
5329419 openeuler ci bot 1578984659