我需要将大块数据(~6MB)从用户空间传输到我的驱动程序。在驱动程序中,我使用pci_alloc_consistent()为每个块分配2个3MB的块。然后,我使用vm_insert_page()将每个块(即2个块) mmap()到单个vma。这允许用户空间在mmap之后对每个块进行读/写。它似乎是有效的,但性能是不可接受的。
我还实现了另一种写入/读取驱动程序中pci_alloc_consistent()分配的内存的方法。我从用户空间使用write(),然后在驱动程序中使用copy_from_user()将块中每个块的内容移动到上面的内存中。我对reads做了相反的事情。
我发现第一种方法至少慢了2-3倍,并且多使用了大约40%的cpu。我预计在第二种情况下引入额外的缓冲区拷贝会使速度变慢。然而,事实并非如此。
我在x86 64位平台上运行了on测试,内核: 2.6.*和3.*。
上面的结果有意义吗?如果是,谁能提供一些正在发生的事情的背景?
谢谢。
发布于 2013-06-29 03:55:50
缓存可能已禁用。您是否对分配的块和vm_inserted进行了ioremap_cache()?Iv在x86/x86_64上遇到这种问题,并与PAT(页属性表)有关。您需要对物理页面执行ioremap_cache()操作,以将内存类型设置为可缓存,然后调用vm_insert_page。这应该可以解决您的性能问题。
https://stackoverflow.com/questions/16628164
复制相似问题