缓存/未缓存的内存mmap:对Neon的影响

时间:2015-10-19 20:02:33

标签: memory-management kernel mmap v4l2

我有一台连接到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);

我有一个复杂的后处理程序集,每个帧上运行基于霓虹灯的算法。它通过标准的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_ *,我会发出一些非常奇怪的声音,也就是说。视频中随机出现几个连续的黑色像素。当访问所有分配的存储器范围时,噪声在某些特定情况下消失。

最后,如果我只是在使用原始pgprot_noncached分配内存时执行memcpy,那么似乎没有任何性能问题,但我无法负担添加memcpy。

我怎样才能解决这种情况呢。获得内核内存分配,没有任何噪音,这与用户空间malloc一样好。

霓虹灯代码以不同的增量执行了很多vld1.u8和vst1.u8。

1 个答案:

答案 0 :(得分:0)

作为参考,解决方案是使内存区域无效并刷新(outer_inv_range和outer_flush_range)。