我发现我的MMIO读/写延迟是不合理的。 我希望有人能给我一些build议。
在内核空间中,我编写了一个简单的程序来读取PCIe设备的BAR0地址中的4字节值。 该设备是一个PCIe英特尔10G网卡,并插在我的Xeon E5服务器上的PCIe x16总线上。 我使用rdtsc来测量MMIO读取开始和结束之间的时间,代码片段如下所示:
vaddr = ioremap_nocache(0xf8000000,128); // addr is the BAR0 of the device rdtscl(init); ret = readl(vaddr); rmb(); rdtscl(end);
我期望(结束,初始化)之间的时间间隔小于1us,毕竟穿过PCIe数据链路的数据应该只有几个纳秒。 不过,我的testing结果显示至less有5.5用于做一个MMIO PCIe设备读取。 我想知道这是否合理。 我改变我的代码,以远程内存屏障(人民币),但仍然有5 us左右的延迟。
本文提到PCIe延迟测量。 通常不到1us。 www.cl.cam.ac.uk/~awm22/…/miller2009motivating.pdf我是否需要做任何特殊的configuration,例如内核或设备来获得更低的MMIO访问延迟? 或者有没有人有过这样的经历呢?
为什么struct cdev有kobject成员?
不能使用request_irq()与“虚拟”IRQs?
打开固件设备树的概述/参考手册
创build支持读,写和ioctl的/ dev / fakeDevice
Linux设备驱动程序不安全FXSAVE / FXRSTOR错误 – 任何先例?
谢谢! 威廉
3G互联网棒 – 哪个库使这项工作
尝试插入访问导出符号的模块时出现“参数无效”错误
开发/debugginglinux内核的最高效和优雅的方式是什么?
在printk格式中%p 的含义
5usec很棒! 在循环统计,你可能会发现更大的值。
有几个原因。 BAR通常是不可缓存和不可预取的 – 使用pci_resource_flags()检查你的。 如果BAR被标记为可缓存,则缓存一致性 – 确保所有cpu具有相同缓存值的过程可能是一个问题。
其次,阅读io总是一个非贴子的事情。 cpu必须停止运行,直到它获得某些数据总线上的通信许可,并停止更多的数据直到数据到达总线上。 这辆巴士看起来像记忆,但实际上并不是这样,这个摊位可能是一个不可中断的忙碌的等待,但它的非生产性却永远不会。 所以我认为即使在开始考虑任务抢占之前,最坏情况下的延迟也会远高于5us。
如果网卡需要通过网络,也许通过交换机,从远程主机获取数据,5.5us是一个合理的读取时间。 如果您正在读取本地PCIe设备中的寄存器,则应该小于1us。 我没有任何有关英特尔10G网卡的经验,但曾与Infiniband和定制卡合作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。