Linux内存管理器侵犯了PCI内存

时间:2014-02-10 01:37:41

标签: memory linux-kernel linux-device-driver embedded-linux dma

我的主板有一个Cavium Octeon NPU,运行Linux内核2.6.34.10,充当PCIe Root Complex。它连接到PCIe交换机,以及其他一些外围设备(端点),其中有Marvell的基于9143 PCI-to_SATA控制器的SSD。

当最初枚举PCIe时,Octeon上的PCI驱动程序会增加所有可预取内存资源的大小,并相应地对上游交换机端口上的PLIMIT和PBASE进行编程。在我的情况下,地址范围是0x80000000 - 0xEFFFFFFF。

之后,我希望内核内存管理器为DMA缓冲区等分配地址范围是不可访问的。然而,我看到内核,在某些时候开始向SSD设备发送SCSI请求,其中分散 - 收集列表元素属于此地址范围。我通过查看PCI分析仪跟踪证实了这一点。当然,当SSD控制器接收到这样的地址时,它会尝试访问它(DMA读或写),并且失败,因为上游交换机端口拒绝将此请求上行转发到Root Complex,因为它被编程为认为该地址将是它的下游。 (有趣的是,它主要发生在我操作大文件时,我看到内核分配的缓冲区地址向下增长,直到它们低于0xEFFFFFFF)

因此,问题:不应该PCI枚举/重新扫描代码,告诉内核 - 这些是PCI设备寄存器地址,因此是DMA缓冲区分配的禁止限制?或者每个设备驱动程序是否有责任保留其可预取的内存? Marvell驱动程序我使用保留常规内存BAR,但不是预先存储的内存。这是一个问题吗?

提前致谢,并为冗长的描述道歉。

0 个答案:

没有答案