mmap()比write()copy_form_user()慢,为什么?

时间:2013-05-18 19:27:24

标签: linux-kernel linux-device-driver dma pci-e

我需要从用户空间向我的驱动程序传输大块数据(~6MB)。在驱动程序中,我使用pci_alloc_consistent()为每个块分配2个3MB块。然后我使用vm_insert_page()将每个块(即2个块)mmap()映射到单个vma。这允许用户空间在mmap之后读/写每个块。它似乎有效,但性能是不可接受的。

我还实现了另一种写入/读取驱动程序中pci_alloc_consistent()分配的内存的方式。我使用来自用户空间的write(),然后使用驱动程序中的copy_from_user()将块中每个块的内容移动到上面的内存中。我为读取做了相反的事。

我发现第一种方法至少慢了2-3倍,使用了大约40%的cpu。我预计在第二种情况下引入额外的缓冲区副本会使其变慢。但事实并非如此。

我在x86 64位平台上运行了测试,内核:2.6。*和3。*。

上述结果有意义吗?如果是,有人可以提供一些有关正在发生的事情的背景知识吗?

感谢。

1 个答案:

答案 0 :(得分:3)

缓存可能已禁用。你是否ioremap_cache()你分配的块和vm_inserted?我在x86 / x86_64上遇到过这种问题,并且与PAT(页面属性表)有关。您需要ioremap_cache()物理页面将内存类型设置为可缓存,然后调用vm_insert_page。这应该可以解决您的性能问题。