6

サイズが約 40 MB の大きな DMA バッファを割り当てたいと考えています。を使用する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 バッファをどのように割り当てることができますか?

4

1 に答える 1

9

システムが起動した後はdma_alloc_coherent()、大規模な割り当てに対して必ずしも信頼できるとは限りません。これは、移動できないページがすぐに物理メモリをいっぱいにして、連続する大きな範囲がまれになるためです。これは長い間問題でした。

便利なことに、最近のパッチセットが役立つかもしれません。これは、カーネル3.5に登場した連続したメモリアロケータです。これでカーネルを使用している場合はcma=64M、カーネルコマンドラインを渡すことができ、その量のメモリが予約されます(移動可能なページのみがそこに配置されます)。その後、40Mの割り当てを要求すると、確実に成功するはずです。シンプル!

詳細については、このLWNの記事を確認してください。

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

于 2013-02-05T19:21:48.567 に答える