测试发现是由于mpp驱动的dma buf不能随进程结束自动释放的原因。
复现方法:
# 停止显示服务[root@RK3568:/]# /etc/init.d/S50launcher stop # 确认没有dmabuf注册[root@RK3568:/]# grep objects /sys/kernel/debug/dma_buf/bufinfoTotal 0 objects, 0 bytes # 测试命令[root@RK3568:/]# while true; do timeout 1 gst-play-1.0 --no-interactive --audiosink=fakesink --videosink=fakesink /1.mp4 ;done &>/dev/null 监控dma buf数量 正常数量应该保持在一个稳定值[root@RK3568:/]# watch -n 1 "grep objects /sys/kernel/debug/dma_buf/bufinfo"
解决方法:kernel中应用以下补丁
--- a/drivers/video/rockchip/mpp/mpp_common.c+++ b/drivers/video/rockchip/mpp/mpp_common.c@@ -319,8 +319,16 @@ int mpp_session_deinit(struct mpp_session *session) mpp_dbg_session("session %p:%d task %d release\n", session, session->index, task_count);- if (task_count)+ if (task_count) {+ struct mpp_dev *mpp = session->mpp;+ if (mpp) {+ mpp_session_clear(mpp, session);+ mpp_iommu_down_write(mpp->iommu_info);+ mpp_dma_session_destroy(session->dma);+ mpp_iommu_up_write(mpp->iommu_info);+ } return -1;+ }