Rockchip · AI & Linux Hub

Linux 与启动

Rockchip Linux DMA-BUF:内存泄漏、IOVA 与峰值调试

完整整理 RK3588 Linux 5.10 DMA-BUF 调试宏、procfs、视频播放内存与峰值示例。

· ArmSoM Editorial · Rockchip source documentation · 3 分钟阅读

ArmSoM 适用说明与来源

本文是 ArmSoM 适配前的平台参考,来源为中文 V1.0.0。原文范围:RK3588,Linux 5.10。没有英文 PDF;英文、俄文、德文均完整译自中文,德文复用英文文章的同一配图。尚未核实具体 ArmSoM 板卡、SDK/BSP 或驱动组合,未进行硬件验证。请核对实际 SoC、板卡内存布局、SDK/BSP、内核配置和驱动实现。代码、地址、日志及数据是原文示例,不是 ArmSoM 实测。

校对记录 · ArmSoM Docs · Rockchip Linux

本文介绍内存泄漏、数据流错误及内存映射失败的 DMA-BUF 调试手段。原稿无技术配图,不添加虚构原图。

原文芯片 原文内核
RK3588 Linux 5.10

1. 简介

DMABUF是多媒体设备之间共享内存的一种特定buffer结构,不同设备可以通过DMABUF的fd进行跨进程共享内存,实现零拷贝提高性能,支持异步访问降低模块耦合度。

2. DMABUF 调试Linux修改

2.1 DMABUF_DEBUG

Linux-5.10开始支持DMABUF debug,支持此功能需要修改arch/arm64/configs/rockchip_defconfig

CONFIG_DMABUF_DEBUG=y

打开该宏定义,每个DMABUF会默认设置name,以pid+taskname的形式,16个字符。如

416-allocator@4.

2.2 DMABUF_PROCFS

Linux-5.10开始支持DMABUF procfs,支持此功能需要修改arch/arm64/configs/rockchip_defconfig

CONFIG_RK_DMABUF_PROCFS=y

打开该宏定义,在/proc/节点下创建一个rk_dmabuf的子结点,该子节点支持多种调试节点,如

dev # 显示所有DMABUF已经attach的device
sgt # 显示所有DMABUF的ScatterListTable,显示其IOVA
size # 显示所有DMABUF的total size
peak # 显示所有DMABUF的total size的峰值

节点含义:dev 显示 attach 的设备;sgt 显示 ScatterListTable 及 IOVA;size 显示总大小;peak 显示总大小峰值。

2.3 DMABUF_DEBUG_ADVANCED

是DMABUF procfs的一个子功能,用于获取DMABUF的内存物理地址,支持此功能需要修改arch/arm64/configs/rockchip_defconfig

CONFIG_DMABUF_DEBUG_ADVANCED=y

打开该宏定义,所有DMABUF都会通过fake device去attach/map,从而获取到它的sgt,协助/proc/rk_dmabuf_sgt完整显示所有DMABUF的IOVA。

3. QA

3.1 RK3588 视频播放DMABUF内存泄漏?

打开调试宏,在进入主界面

console:/ # cat /proc/rk_dmabuf/size
Total: 65552 KiB

播放视频、退出播放、删除历史内容、回到主界面

console:/ # cat /proc/rk_dmabuf/size
Total: 83948 KiB

3.2 RK3588 视频播放DMABUF内存峰值?

通过mpp的调试节点,查看播放视频的DMABUF的总内存大小

console:/ # cat /proc/mpp_service/sessions-summary
fdc38100.rkvdec-core Total: 699760 KiB

通过DMABUF的调试节点,查看DMABUF峰值内存

console:/ # cat /proc/rk_dmabuf/peak
Peak: 1544 MiB

清零重新观察

console:/ # echo 0 > /proc/rk_dmabuf/peak

浏览此主题 → · 入门路线 →