UIO驱动实现逻辑及用户态交互相关技术疑问咨询
UIO与DPDK相关问题解答
问题1:对/dev/uioX、/sys/class/uio/uioX/device/config、/sys/class/uio/uioX/device/resourceX执行read/write操作,是否会比使用内核网络驱动产生更多的上下文切换?
不会,反而整体上下文切换次数远低于内核网络驱动:
- 上述三个文件中,
/sys路径下的两个文件仅在驱动初始化、配置阶段读写,运行时不会频繁操作,产生的上下文切换可以忽略。 /dev/uioX的read操作仅在UIO使用中断触发模式时才会调用,一次read调用对应一次中断触发的上下文切换。而内核网络驱动除了中断上下文切换外,还需要经过内核协议栈处理、socket系统调用、软中断调度等多轮上下文切换,整体开销远高于UIO。- 主流DPDK基于UIO的实现默认使用轮询模式收发包,运行时完全不需要调用上述文件的read/write接口,没有额外的上下文切换开销。
问题2:每个中断是否对应一个收/发数据包事件?read()的返回值是否为新接收的数据包数量?
均不成立:
- 从
/dev/uioXread得到的是累计的总中断计数,不是本次新增的中断数,更不是新接收的数据包数量。 - 中断触发的原因不只有收/发包事件,网卡链路状态变更、硬件错误、队列溢出等事件都会触发中断,导致计数上涨。
- 就算触发的是收包中断,网卡也可能通过NAPI机制在一次中断中处理多个数据包,不存在一个中断对应一个数据包的对应关系。
问题3:UIO仅支持一种类型的中断吗?
原生UIO框架的设计确实仅支持单类型中断:
- 每个UIO设备在框架层面仅绑定一个中断号,用户态只能读取全局的中断累计计数,无法区分中断的具体类型。
- 如果需要支持多中断、可区分中断类型的用户态驱动能力,需要切换到VFIO框架,或者自行扩展UIO内核驱动的自定义逻辑。
问题4:若绑定的用户进程崩溃,谁负责释放这些HUGEPAGEs资源?NIC如何感知并停止相关数据传输操作?
- 大页资源释放:HUGETLBFS的内存映射归内核管理,用户进程崩溃退出时,内核会自动回收该进程持有的所有私有的大页内存;如果是多进程共享的大页,会等到所有关联进程都退出后再回收。
- NIC停止传输逻辑:用户进程崩溃后,内核会自动关闭进程打开的所有UIO设备文件描述符,触发UIO内核驱动的释放回调,回调中会复位PCIe设备的DMA配置、关闭网卡队列、清空中断配置。NIC失去有效的DMA物理地址映射后,发送/接收的数据包会直接丢弃,不会再往之前的内存地址写入数据。
内容的提问来源于stack exchange,提问作者Adi Peled
相关产品推荐
相关产品推荐

