2013-10-17 50 views
0

我有這個x86設備和一個嘗試分配DMA內存的內核模塊。它有一個名爲dmasize的參數,可以控制分配內存的大小。當內核3.2上的緩衝大於2M時,dma_alloc_coherent失敗

我注意到,當dmasize = 2M時分配成功,但如果更大則不會。即使在啓動時。 我聽說CONSISTENT_DMA_SIZE有一個限制,但是看到lxr,我無法在arch x86內核3.2中找到它。

不確定它是否相關,但是這是一個32位機器,具有8GB內存和啓用pae的內核。

這是調用dma_alloc_coherent:

dma_addr_t dma_handle; 

if (!(_dma_vbase = dma_alloc_coherent(0, alloc_size, &dma_handle, GFP_KERNEL)) || !dma_handle) { 
    gprintk("_alloc_mpool: Kernel failed to allocate the memory pool of size 0x%lx\n", (unsigned long)alloc_size); 
    return; 
    } 

欣賞人誰可以幫助這一點。

+0

您的設備是在ISA還是PCI總線上? –

+0

PCI。它會影響函數調用嗎? – shayst

+0

對於PCI設備,您必須設置'dma_alloc_coherent'的第一個參數。無論如何,大的分配可能需要[連續內存分配器](http://mina86.com/2012/06/10/deep-dive-into-contiguous-memory-allocator-part-i/)。 –

回答

1

只要萬一有人遇到這個問題,答案如下: 配置標誌CONFIG_FORCE_MAX_ZONEORDER默認爲11,最多的體系結構是造成這種限制的原因。

將它增加到12(並重新編譯內核)修復了這個問題。

我懷疑使用CMA也是可能的,但由於我的內核不支持它,所以我不能肯定地說。

相關問題