分配一个大DMA缓冲区(Allocating a large DMA buffer)

2019-08-16 15:40发布

我想分配一个大DMA缓冲区,大小约为40 MB。 当我使用dma_alloc_coherent()它失败,我所看到的是:

------------[ cut here ]------------
WARNING: at mm/page_alloc.c:2106 __alloc_pages_nodemask+0x1dc/0x788()
Modules linked in:
[<8004799c>] (unwind_backtrace+0x0/0xf8) from [<80078ae4>] (warn_slowpath_common+0x4c/0x64)
[<80078ae4>] (warn_slowpath_common+0x4c/0x64) from [<80078b18>] (warn_slowpath_null+0x1c/0x24)
[<80078b18>] (warn_slowpath_null+0x1c/0x24) from [<800dfbd0>] (__alloc_pages_nodemask+0x1dc/0x788)
[<800dfbd0>] (__alloc_pages_nodemask+0x1dc/0x788) from [<8004a880>] (__dma_alloc+0xa4/0x2fc)
[<8004a880>] (__dma_alloc+0xa4/0x2fc) from [<8004b0b4>] (dma_alloc_coherent+0x54/0x60)
[<8004b0b4>] (dma_alloc_coherent+0x54/0x60) from [<803ced70>] (mxc_ipu_ioctl+0x270/0x3ec)
[<803ced70>] (mxc_ipu_ioctl+0x270/0x3ec) from [<80123b78>] (do_vfs_ioctl+0x80/0x54c)
[<80123b78>] (do_vfs_ioctl+0x80/0x54c) from [<8012407c>] (sys_ioctl+0x38/0x5c)
[<8012407c>] (sys_ioctl+0x38/0x5c) from [<80041f80>] (ret_fast_syscall+0x0/0x30)
---[ end trace 4e0c10ffc7ffc0d8 ]---

我已经尝试不同的值,它看起来像dma_alloc_coherent()不能分配超过2 ^ 25字节(32 MB)。

试问,这样一个大的DMA缓冲区可以分配呢?

Answer 1:

在系统启动后,最多dma_alloc_coherent()并不一定可靠的大分配。 这完全是因为不可移动的页面迅速填满你的物理内存使大范围的连续罕见。 这已经很长一段时间的问题。

便利最近的补丁集,可以帮助你,这是连续内存分配器它出现在内核3.5。 如果你使用这个内核,那么你应该能够通过cma=64M上你的内核命令行和多内存会被保留(仅移动页面将被放在那里)。 当您随后询问您的40M分配应该可靠地取得成功。 Simples!

欲了解更多信息,请查阅本LWN文章:

https://lwn.net/Articles/486301/



文章来源: Allocating a large DMA buffer