gpt4 book ai didi

linux-kernel - 分配大的 DMA 缓冲区

转载 作者:行者123 更新时间:2023-12-04 04:02:28 25 4
gpt4 key购买 nike

我想分配一个大的 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缓冲区怎么分配?

最佳答案

系统启动后dma_alloc_coherent()对于大分配不一定可靠。这仅仅是因为不可移动的页面会迅速填满您的物理内存,从而使大的连续范围变得罕见。这是一个长期存在的问题。

方便的是,最近的补丁集可以帮助您,这是出现在内核 3.5 中的连续内存分配器。如果你正在使用内核,那么你应该能够通过 cma=64M在您的内核命令行上,并且将保留大量内存(仅可移动页面将放置在那里)。当您随后要求分配 40M 时,它应该会可靠地成功。简单!

有关更多信息,请查看这篇 LWN 文章:

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

关于linux-kernel - 分配大的 DMA 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14625919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com