airockchip / librga

Apache License 2.0
276 stars 52 forks source link

请教大家: RK3588 使用RGA,拷贝mpp解码后的数据到主机内存。 调用imcopy() 报错: Device or resource busy #27

Closed howieOfive closed 1 year ago

howieOfive commented 1 year ago

RGA imcopy报错: RgaBlit(1465) RGA_BLIT fail: Device or resource busy 环境为:RK3588,ubuntu20.04系统,内存8GB RGA版本: rgaapi version 1.8.1[0]

int fd, rett;
rga_buffer_t src_img, dst_img;
rga_buffer_handle_t src_handle, dst_handle;
im_handle_param_t handle_param, handle_param2;
handle_param.height = height;
handle_param.width =width;
handle_param.format = fmt;

handle_param2.height = height;
handle_param2.width =width;
handle_param2.format = fmt;

if ( (fd = mpp_buffer_get_fd(buffer)) < 0 ) {   // buffer   = mpp_frame_get_buffer(frame);
    PRT_EXIT("mpp_buffer_get_fd() failed.");
}

src_handle = importbuffer_fd(fd, &handle_param);    
void *ptr = (void *)malloc(1024*1024*4);
dst_handle = importbuffer_virtualaddr((void *)ptr, &handle_param2);

printf("rc_handle[%u] dst_handle[%u]、n", src_handle, dst_handle); // handler 都大于0
src_img = wrapbuffer_handle(src_handle, width, height, fmt);
dst_img = wrapbuffer_handle(dst_handle, width, height, fmt);

// imcopy报错:  RgaBlit(1465) RGA_BLIT fail: Device or resource busy
rett = imcopy(src_img, dst_img);
Cerf-Yu commented 1 year ago

使用其他的mpp buffer的虚拟地址是否能够正常拷贝?以及使用其他的dma-buf fd是否能够正常使用

howieOfive commented 1 year ago

更新一下rk3588上使用imcopy的现象:

1、设置RGA2 imconfig(IM_CONFIG_SCHEDULER_CORE, IM_SCHEDULER_RGA2_DEFAULT);
调用上述imconfig接口,设置为RGA2来进行imcopy,昨天一直能把YUV数据拷贝出来,写成文件打开也正常,以为问题解决了。 但是今天就一直报错, _程序报错:RgaBlit(1465) RGA_BLIT fail: Invalid argument dmesg信息: rga_policy: RGA2 only support under 4G memory!__ 板载是8GB内存,唯一的解释就是:是昨天malloc恰好一直能分配到4GB地址空间一下的内存,今天就不行了。 问题1: 怎么在超过4GB板载内存的环境下,正常使用RGA2。 我找了很多方法,也不能保证申请的内存地址在4GB以下。

2、设置RGA3 imconfig(IM_CONFIG_SCHEDULER_CORE, IM_SCHEDULER_RGA3_DEFAULT);
调用上述imconfig接口,设置使用RGA3,调用imcopy一直失败。 _程序报错:RgaBlit(1465) RGA_BLIT fail: Device or resource busy dmesg信息: rga_job: rga_jobwait timeout 问题2: 怎么在rk3588上使能RGA3。

问题3: 我的初衷是把MPP解码后的数据从设备内存拷贝到系统内存,需要借助RGA来加快拷贝,减轻CPU消耗。 能提供建议吗?

Cerf-Yu commented 1 year ago

问题1: 怎么在超过4GB板载内存的环境下,正常使用RGA2。 我找了很多方法,也不能保证申请的内存地址在4GB以下。

malloc是没办法指定申请的内存范围的,可以使用其他dma-buf的分配器有支持的申请4G以内的,或者可以见示例代码:https://github.com/airockchip/librga/blob/main/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp 这里是使用的最底层的dma_buf_heap来分配内存的,dma_buf_heap是可以支持配置指定的heap来实现指定申请4G以内内存。

问题2: 怎么在rk3588上使能RGA3。

相同的配置RGA2能跑RGA3跑不了么?

  1. 首先要确认你配置的参数是否能够在RGA3上运行,imconfig会导致跳过部分检查。
  2. 确认importbuffer的大小是否满足配置的图像的要求。
  3. 如果依旧存在超时,RGA3的超时通常是和内存相关的,可以尝试更新驱动到1.2.25(faq文档中有网盘链接)后在运行问题场景,1.2.25版本驱动针对RGA3增加了部分超时场景的拦截与检测,可以更新后看看日志是否有变化。

问题3: 我的初衷是把MPP解码后的数据从设备内存拷贝到系统内存,需要借助RGA来加快拷贝,减轻CPU消耗。 能提供建议吗?

以上的使用imcopy的行为是正常的,另外此前有发现一个dma相关的补丁会影响到使用dma-buf的设备访问内存导致超时的问题不知是否有关,可以尝试更新SDK 到最新,或者检查一下kernel中是否有附件的补丁。 0001-dma-buf-dma-buf-cache-fix-concurrency-issue.patch

cancerwower commented 1 year ago

我用的板子是RK3588,16GB。我之前RGA是默认的CONFIG,偶尔会出现RgaBlit(1465) RGA_BLIT fail: Invalid argument。今天看到这个问题,配置RGA只使用RGA3_CORE0 和 RGA3_CORE1。目前没有BUG。

1683291353017 7265714123377f386e3bd6f8ad983fd
cancerwower commented 1 year ago

我用的板子是RK3588,16GB。我之前RGA是默认的CONFIG,偶尔会出现RgaBlit(1465) RGA_BLIT fail: Invalid argument。今天看到这个问题,配置RGA只使用RGA3_CORE0 和 RGA3_CORE1。目前没有BUG。 1683291353017 7265714123377f386e3bd6f8ad983fd 运行一个小时左右还是出了问题。。。。

Cerf-Yu commented 1 year ago
  1. 关于内存限制部分前面已经讲过了,faq中也有关于4G内存限制的一些介绍可以看一下。
  2. 关于“ Invalid argument”报错,通常说明出现了非法的参数,可以通过开启驱动运行日志查看dmesg日志的方式确认报错原因,并对比不同核心的硬件限制去进行修改。
zhanglm666 commented 3 months ago

问题1: 怎么在超过4GB板载内存的环境下,正常使用RGA2。 我找了很多方法,也不能保证申请的内存地址在4GB以下。

malloc是没办法指定申请的内存范围的,可以使用其他dma-buf的分配器有支持的申请4G以内的,或者可以见示例代码:https://github.com/airockchip/librga/blob/main/samples/allocator_demo/src/rga_allocator_dma32_demo.cpp 这里是使用的最底层的dma_buf_heap来分配内存的,dma_buf_heap是可以支持配置指定的heap来实现指定申请4G以内内存。

这里的dma方式只是分配4G下的内存空间,然后还需要将外部的图像数据通过memcpy拷贝到dma的内存上,然后再进行resize等操作,操作完成后,再将视频数据拷贝出去,一来一回10ms没了,请问这种拷贝耗时如何避免啊?