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

Memory Linux内存管理器侵犯PCI内存,memory,linux-kernel,linux-device-driver,embedded-linux,dma,Memory,Linux Kernel,Linux Device Driver,Embedded Linux,Dma,我的主板上有一个Cavium Octeon NPU,运行Linux内核2.6.34.10,充当PCIe根复合体。它连接到PCIe交换机,以及其他一些外围设备端点,其中包括Marvell的基于9143 PCI-to_SATA控制器的SSD 最初枚举PCIe时,Octeon上的PCI驱动程序将所有预取内存资源的大小相加,并相应地对上游交换机端口上的PLIMIT和PBASE寄存器进行编程。在我的例子中,地址范围是0x8000000-0xEFFFFFF 在那之后,我希望内核内存管理器分配DMA缓冲区等时

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

最初枚举PCIe时,Octeon上的PCI驱动程序将所有预取内存资源的大小相加,并相应地对上游交换机端口上的PLIMIT和PBASE寄存器进行编程。在我的例子中,地址范围是0x8000000-0xEFFFFFF

在那之后,我希望内核内存管理器分配DMA缓冲区等时无法访问该地址范围。然而,我看到内核在某个点开始向SSD设备发送SCSI请求,其中分散-聚集列表元素位于该地址范围内。通过查看PCI analyzer跟踪,我确认了这一点。当然,当SSD控制器接收到这样一个地址时,它会尝试通过DMA读或写来访问它,但失败了,因为上游交换机端口拒绝将该请求转发到根复合体的上游,因为它被编程为认为该地址将在它的下游。有趣的是,当我处理大文件时,通常会发生这种情况,我看到内核分配的缓冲区地址会向下增长,直到下降到0xeffffff以下

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


提前感谢,并为冗长的描述表示歉意。

如果您还没有,我建议您尝试使用linux pci Mail list.caf,这很尴尬,但我该怎么做呢?是否有一个门户允许您向各种Linux邮件列表提交Qestion?@Alex否,您向列表的邮件地址发送了一封邮件。谢谢,向Linux发送了电子邮件-pci@vger.kernel.orgProblem解决了的。这是因为PCI交换机IDT具有32位配置寄存器,而内存地址为64位。当Linux告诉Marvell DMA to/from物理内存地址时,其较低的32位恰好适合上游端口可预取窗口基…限制开关将DMA尝试作为不受支持的请求拒绝,认为此地址位于其下游,因此无需将其转发到根复合体。Marvell 9143固件不能很好地处理不支持的请求。解决方案-在连接到Marvell芯片的PCI交换机端口上配置ACS。