2015-10-19 100 views
0

我有一个连接到cortex-A9 OMAP4板的相机。视频V4L2帧在3.4内核分配有:缓存/未缓存的内存mmap:对Neon的影响

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); 

我有一个复杂的后处理组件霓虹灯基于每个帧上运行的算法。它通过一个标准的用v412架构访问帧:此优化算法的

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。

回答

0

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