【发布时间】:2016-02-15 15:16:38
【问题描述】:
我有一个 pci 设备驱动程序,它使用 CMA 分配机制进行 DMA 分配。它在 32 位模式下的内核 3.18 上运行良好,但是当我尝试在 64 位内核中使用它时(与 32 位相同的配置,但打开了 64 位模式)dma 分配失败。
我在 dmesg 中看到的唯一内容是:
fallback device: swiotlb buffer is full (sz: 8388608 bytes)
我使用内核命令行:
swiotlb=16384 iommu=soft cma=256M
并分配 8Mb。
函数调用是:
new_region->kaddr = dma_alloc_coherent( NULL, size, &new_region->paddr, GFP_KERNEL | GFP_DMA32 );
有人可以在 64 位模式下解释这种行为吗?
【问题讨论】:
-
查看this提交的提交信息。也许您的问题是那里描述的案例之一?
-
感谢您的回答。我已经找到了这种代码的平静并在它周围玩耍。似乎分配的最大块大小有一些限制,但我仍然无法弄清楚差异在哪里。
标签: linux-kernel driver x86-64 dma