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学习笔记(一,内存简介)

Linux内存从0到1学习笔记(五,内存分类)

Linux内存从0到1学习笔记(8.5,CMA内存分配)

Linux内存从0到1学习笔记(七,用户空间虚拟内存之二 - 内存空间的建立)

Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)

Linux内存从0到1学习笔记(11.2 内存优化方案之内存压缩zram)