微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MMIO读/写延迟

我发现我的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互联网棒 – 哪个库使这项工作

为什么要做一个中断处理程序static.is它是必要的

尝试插入访问导出符号的模块时出现“参数无效”错误

开发/debugginglinux内核的最高效和优雅的方式是什么?

在printk格式中%p 的含义

5usec很棒! 在循环统计,你可能会发现更大的值。

有几个原因。 BAR通常是不可缓存和不可预取的 – 使用pci_resource_flags()检查你的。 如果BAR被标记为可缓存,则缓存一致性 – 确保所有cpu具有相同缓存值的过程可能是一个问题。

其次,阅读io总是一个非贴子的事情。 cpu必须停止运行,直到它获得某些数据总线上的通信许可,并停止更多的数据直到数据到达总线上。 这辆巴士看起来像记忆,但实际上并不是这样,这个摊位可能是一个不可中断的忙碌的等待,但它的非生产性却永远不会。 所以我认为即使在开始考虑任务抢占之前,最坏情况下的延迟也会远高于5us。

如果网卡需要通过网络,也许通过交换机,从远程主机获取数据,5.5us是一个合理的读取时间。 如果您正在读取本地PCIe设备中的寄存器,则应该小于1us。 我没有任何有关英特尔10G网卡的经验,但曾与Infiniband和定制卡合作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐