Linux内存从0到1学习笔记(10.1 BugsShooter之cma配置过小导致页迁移繁忙而内存申请失败)
Posted 高桐@BILL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存从0到1学习笔记(10.1 BugsShooter之cma配置过小导致页迁移繁忙而内存申请失败)相关的知识,希望对你有一定的参考价值。
一、问题描述
系统进行老化测试过程中,进程发生crash。
二、关键日志分析
2.1 tombstone
分析进程tombstone中的CALL STACK,确认为_M_allocate_bucket进行bucket内存分配时发生异常;
2.2 kernel或串口日志
alloc_congit_range:(xxx, xxx)PFNs busy;
cma:cma_alloc:alloc failed,req-size:2560 pages,reg: -16
[drm:xxx_gem_alloc_dma]*ERROR* failed to allocate buffer of size xxx
[drm:xxx_gem_alloc_dma]*ERROR* failed to allocate buffer of size xxx
3.3 meminfo信息
CmaTotal: 524288KB
CmaFree: 47792KB
三、问题分析
如上日志来看,当前cma内存有空间但页繁忙(页正被访问,无法迁移)迁移不了导致cma内存分配失败。
这里的cma内存有空间是指对dma接口来讲。比如说系统预留了512M的CMA内存,但是通过dma_alloc只申请了256M。剩余的256M被空间被伙伴系统作为可移动类型内存页使用;但对于设备驱动,还是有256内存可见,此时需要进行页迁移来满足设备驱动的连续内存的申请。但由于当前页正被访问,导致页繁忙而无法迁移。就会引起以上问题。
四、解决方案
可增大cma预留内存;也可以在__page_cache_alloc申请内存时去掉__GFP_MOVABLE标记,页缓存不申请cma内存。
还有一种通过fix的方式去分配cma的使用。
以上是关于Linux内存从0到1学习笔记(10.1 BugsShooter之cma配置过小导致页迁移繁忙而内存申请失败)的主要内容,如果未能解决你的问题,请参考以下文章
Linux内存从0到1学习笔记(七,用户空间虚拟内存之二 - 内存空间的建立)