缓冲区>时dma_alloc_coherent失败内核3.2上的2M

时间:2013-10-17 10:05:56

标签: linux-kernel kernel-module dma

我有这个x86设备和一个尝试分配DMA内存的内核模块。它有一个名为dmasize的参数,允许控制已分配内存的大小。

我注意到当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;
    }

感谢任何可以提供帮助的人。

1 个答案:

答案 0 :(得分:1)

万一有人碰到这个,答案如下: 配置标志CONFIG_FORCE_MAX_ZONEORDER在最多架构下默认为11是导致此限制的原因。

将其增加到12(并重新编译内核)可以解决问题。

我怀疑使用CMA也是可能的,但由于我的内核不支持它,我不能肯定地说。