【发布时间】:2017-01-31 13:59:28
【问题描述】:
我正在尝试从/向 PCIe 2.0(2 通道)设备读取/写入 Linux PC 数据。用于读取和写入的内存位于 PCIe 设备中的不同 RAM 位置。这些内存使用 ioremap 在 Linux PC 中进行映射。我的用例是实现 18MBytes/秒的读/写吞吐量,这显然是由 PCIe 链路支持的。 PCIe 设备上的内存未缓存。
我能够实现写入吞吐量,即当我使用 memcpy 从 Linux PC 本地内存写入 PCIe 设备内存时。在这种情况下,对于 9216 字节的数据,memcpy 花费的时间不到 1 毫秒。但是当我将 ioremap 的 PCIe 内存读取到 Linux 本地内存时,数据丢失正在发生。我分析了 memcpy,9216 字节的数据需要超过 1 毫秒,有时需要 2 毫秒。我不想为这个操作做 DMA。
对这种情况下可能出现的问题有什么想法吗?我该如何处理?
【问题讨论】:
-
从发布一些代码开始。
-
这就是未缓存传输的结果。写入速度更快,因为它们可以被缓冲。
-
另一方面,读取保证所有先前的写入都在总线上完成。它也可能会影响吞吐量。
-
@CL。谢谢你的回复。内存在 PCIe 设备端未缓存,而不是在 Linux PC 端。 PCIe 设备内存缓冲区正以适当的速度变满。从 PCIe 内存到缓存的 Linux PC 本地内存的 memcpy 需要更多时间。我没有明白你所说的写入速度更快。
-
如果您的源、目标和字节数是 32 位对齐的,您可以使用
__iowrite32_copy和__ioread32_copy(记得将字节数除以 4)而不是memcpy。如果您的源、目标和字节数是 64 位对齐的,您可以使用__iowrite64_copy和__ioread64_copy(记得将字节数除以 8)。
标签: memory linux-kernel linux-device-driver pci-e