【Semidrive X9E】解决仪表小概率黑屏的问题

一、问题描述

仪表黑屏的时候 AP2 drm 报 vblank wait timeout,并且 Linux panic 了,且 Linux 运行时会一直会有 PFNs busy 的打印。
<6>[ 70.909643] alloc_contig_range: [71600, 71b46) PFNs busy
<6>[ 70.909815] alloc_contig_range: [71700, 71c46) PFNs busy
<4>[ 70.942686] [CRTC:35:crtc-0] vblank wait timed out
<4>[ 70.942712] ------------[ cut here ]------------
<4>[ 70.942729] WARNING: CPU: 0 PID: 2294 at /users/lichengliang/shanqi/x9/yocto/source/linux/drivers/gpu/drm/drm_atomic_helper.c:1240 drm_atomic_helper_wait_for_vblanks.part.7+0x248/0x260
<4>[ 70.942732] Modules linked in: pvrsrvkm

二、分析和解决过程

1. 根据以往出现类似 drm 日志的处理方法,将 drm 版本从 PTG4.0 升级到 PTG4.3,更新后继续压测,还是会有 vblank wait timeout 的打印。

2. 然后怀疑是 PFNs busy 导致 drm 出现报错,且 PFNs busy 一般是由于用来存放图像缓冲数据的 cma 空间紧张才会出现的, cat /proc/meminfo 确认 cma 剩余空间,确认到分配了 256MB 空间给 cma,在运行仪表 app 时仅剩余 20MB 左右,然后增加分配给 cma 的空间:


① 首先添加打印确认 kernel 的连续内存空间状态,添加打印的 patch 如附件:
[ 0.000000] size = 0x15e00000,align = 0x400000,start = 0x0,end = 0xffffffff
[ 0.000000] __memblock_find_range_top_down:160 start=0x66300000,end=-x80000000,cand=ffffffc8
发现有一块 413MB 的连续内存空间,先将 cma 空间设置成 400M 试试看。

② 设置成 400M 系统会变卡,可能是 cma 挤占了其他进程的空间,然后改小一点,改成 350M 后通过 log 发现 cma 申请失败,报错是内存对齐检验失败,通过 kernel 代码确认到 cma 需要设置成 4MB 的倍数,随后成功将 cma 设置成 320MB。

③ 继续压测,依然会有 vblank wait timeout 的报错,看 meminfo 发现剩余 cma 内存有 200 多 MB,压测发现 vblank wait timeout 的时候并没有申请 cma 空间失败,PFNs busy 的打印只是内存管理模块一直在寻找空闲的内存页而打出来的。

3. 怀疑方向转回 drm 这边,对比了升级 drm4.3 的 patch 和 X9-PTG4.0-Normal-Featrue-ctrcTimeOut-patch-731801 这个 patch,发现升级 drm 的 patch 没有包含后者的以下部分:



这部分是增加 vblank 和 flip 的等待时间,缓解硬件处理图像的压力,修改后,目前压力测试一周没有复现问题。

技术文档

类型标题档案
操作手册c file+diff file

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论