当使用malloc分配缓冲区时,pci_map_sg在(PCIe)DMA驱动程序中失败

当使用malloc分配缓冲区时,pci_map_sg在(PCIe)DMA驱动程序中失败,c,linux-kernel,linux-device-driver,dma,C,Linux Kernel,Linux Device Driver,Dma,我有一个带有DMA引擎的定制PCIe卡。 我正在尝试使用malloc(非页面对齐)为DMA分配用户空间内存,然后get\u user\u pages\u fast(也尝试了普通get\u user\u pages),然后在高通arm64平台上调用该页面上的pci\u map\u sg。 在这个特定的设备中,在使用malloc(经过多次迭代)分配总共256 MB(重新启动后)内存后,pci_map_sg失败 收到错误后,所有后续pci_map_sg将失败,直到重新启动 在使用malloc/get\

我有一个带有DMA引擎的定制PCIe卡。 我正在尝试使用malloc(非页面对齐)为DMA分配用户空间内存,然后get\u user\u pages\u fast(也尝试了普通get\u user\u pages),然后在高通arm64平台上调用该页面上的pci\u map\u sg。 在这个特定的设备中,在使用malloc(经过多次迭代)分配总共256 MB(重新启动后)内存后,pci_map_sg失败

收到错误后,所有后续pci_map_sg将失败,直到重新启动

在使用malloc/get\u user\u pages\u fast/pci\u map\u sg时,一些256 MB的缓冲区似乎正在耗尽,但我没有从meminfo获得任何信息。meminfo中的一切看起来都很正常,都是免费的

所有内存分配/释放固定/取消固定都有序且正确。没有发现任何可能的泄漏

此外,此问题仅在非页面对齐的buf中发生。如果使用valloc而不是malloc,则不会发生问题。 使用mmap分配的页面对齐缓冲区也会无误地通过

非常感谢您的指点和帮助


请注意,此驱动程序适用于其他平台(x86_64,arm64(NVidia Jetson,iMX8))

侧注:
pci_map_sg()
已弃用,您不应在新代码中使用它。哦!对不起,我忘了在问题中提到这一点。我也尝试过使用
dma\u map\u sg
。但仍然得到相同的错误。“没有发现任何可能的泄漏”并不意味着没有泄漏。如果不看代码,很难判断。同一个驱动程序在其他平台上工作,没有任何问题,回归运行数周,意味着数百万次迭代。在这个平台上(高通公司),只有前15次迭代成功运行,而第16次迭代失败。如果有任何泄漏,它将在任何其他平台上被击中。此外,我已经验证了这个代码部分,多次发现可能的泄漏,但没有发现任何东西。这就是为什么我说没有可能的泄漏。这更多的是一个理论问题,而不是代码调试。需要检查以下事项:(1)传递给
get\u user\u pages\u fast()
的地址是页面对齐的;(2)
put\u page()
正在页面数组中由
get\u user\u pages\u fast()
填充的所有页面上调用(将修改的页面标记为脏页面后);(3) 如果为页面列表分配了临时缓冲区,则会释放缓冲区;(4) 如果为SG列表分配了临时缓冲区,则会释放缓冲区。