Cached/uncached 内存 mmap:对 Neon 的影响
Cached/uncached memory mmap: impact on Neon
我有一个连接到 cortex-A9 OMAP4 板的摄像头。视频 v4l2 帧在 3.4 内核中分配:
static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)
{
struct vb2_dc_buf *buf = buf_priv;
if (!buf) {
printk(KERN_ERR "No buffer to map\n");
return -EINVAL;
}
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
return vb2_mmap_pfn_range(vma, buf->dma_addr, buf->size,
&vb2_common_vm_ops, &buf->handler);
}
我也测试过:
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
我在每一帧上都有一个复杂的 post-processing assembly Neon-based 算法 运行。它通过标准的 v4l2 架构访问框架:
mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, camera->fd, buf.m.offset);
该优化算法的性能如下:
x ms: user-space malloc allocation of a fake frame (reference)
10*x ms: kernel allocation with pgprot_noncached
4*x ms: kernel allocation with pgprot_writecombine
x ms: kernel allocation with no pgprot call
问题是,如果我不做任何 pgprot_*,我就会有一些非常奇怪的噪音,也就是。视频中随机出现几个连续的黑色像素。当访问所有分配的内存范围时,在某些特定情况下噪音会消失。
最后,如果我只是简单地做一个memcpy,而内存已经分配给原来的pgprot_noncached,似乎没有任何性能问题,但我负担不起添加一个memcpy。
我该如何解决这种情况,也就是。获得一个没有任何噪音的内核内存分配,这与 user-space malloc.
一样好
neon 代码以不同的增量执行大量 vld1.u8 和 vst1.u8。
作为参考,解决方案是使内存区域无效并刷新(outer_inv_range 和 outer_flush_range)。
我有一个连接到 cortex-A9 OMAP4 板的摄像头。视频 v4l2 帧在 3.4 内核中分配:
static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)
{
struct vb2_dc_buf *buf = buf_priv;
if (!buf) {
printk(KERN_ERR "No buffer to map\n");
return -EINVAL;
}
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
return vb2_mmap_pfn_range(vma, buf->dma_addr, buf->size,
&vb2_common_vm_ops, &buf->handler);
}
我也测试过:
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
我在每一帧上都有一个复杂的 post-processing assembly Neon-based 算法 运行。它通过标准的 v4l2 架构访问框架:
mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, camera->fd, buf.m.offset);
该优化算法的性能如下:
x ms: user-space malloc allocation of a fake frame (reference)
10*x ms: kernel allocation with pgprot_noncached
4*x ms: kernel allocation with pgprot_writecombine
x ms: kernel allocation with no pgprot call
问题是,如果我不做任何 pgprot_*,我就会有一些非常奇怪的噪音,也就是。视频中随机出现几个连续的黑色像素。当访问所有分配的内存范围时,在某些特定情况下噪音会消失。
最后,如果我只是简单地做一个memcpy,而内存已经分配给原来的pgprot_noncached,似乎没有任何性能问题,但我负担不起添加一个memcpy。
我该如何解决这种情况,也就是。获得一个没有任何噪音的内核内存分配,这与 user-space malloc.
一样好neon 代码以不同的增量执行大量 vld1.u8 和 vst1.u8。
作为参考,解决方案是使内存区域无效并刷新(outer_inv_range 和 outer_flush_range)。