ef_vi(Ethernet Fabric Virtual Interface) 是 Solarflare / Xilinx / AMD 网卡的最低级用户态 API,也是 Onload 协议栈的底层引擎,它把网卡的收发包环(rings)直接暴露给用户进程,实现完全内核旁路。
1. Virtual Interface(VI)
VI 是核心抽象,代表网卡为应用分配的一个独立的收发对象,每个VI有自己的 RX queue 和 TX queue。
VI = 1 个 EVQ + 1 个 RX ring + 1 个 TX ring
特征:
- VI 之间硬件隔离,互不干扰
- 每个VI 可以绑定到独立的 CPU core
- 支持VI spreading,硬件将不同流的包散列到不同的 VI
2. Event Queue(EVQ)
EVQ是 ef_vi 的事件通知机制,也是一个ring buffer。
主要事件类型:
- RX完成事件:包已写入RX ring
- TX完成事件:包已从TX ring 发到线缆上
- 管理事件:link up/down,MAC 地址变更等
3. RX ring
硬件写,软件读,每个slot包含tag,checksum,length,RSS hash,包数据等,软件处理完后重新 refill RX buffer,并通知硬件。
4. TX ring
三种发送模式
- 普通发送:应用填写buffer,硬件读取发送,完成后产生TX event
- DMA 发送:应用先DMA 拷贝数据到 TX ring 附近的内存,再推送给硬件
- CTPIO(Cut-Through PIO):CPU 通过 PIO 直接将数据写入网卡发送管线,网卡可以边接收边发送
CTPIO为什么快
DMA 路径:
- CPU在主机内存里面构造好包
- CPU 写 desc 告诉 NIC 包位置
- CPU 写 Doorbell 寄存器(通知NIC desc 就绪)
- NIC DMA 引擎构造 Memory Read TLP
- PCIe 往返:NIC,CPU/Root complex,内存控制器,DRAM,读回数据
- NIC DMA 引擎把数据搬进内部TX FIFO
- NIC MAC 引擎从TX FIFO 取出,发到网线
PIO 路径:
- CPU在寄存器/缓存里构造包数据
- CPU执行 MOV 到 MMIO 地址(NIC BAR 映射的 TX FIFO)
- PCIe memory write TLP 把数据送到NIC
- NIC 直接把数据放进TX 管线(CTPIO 还是边写边发)
发表回复