2015-10-19 102 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)無效和刷新。