Kernel bypass #3 ef_vi

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

三种发送模式

  1. 普通发送:应用填写buffer,硬件读取发送,完成后产生TX event
  2. DMA 发送:应用先DMA 拷贝数据到 TX ring 附近的内存,再推送给硬件
  3. CTPIO(Cut-Through PIO):CPU 通过 PIO 直接将数据写入网卡发送管线,网卡可以边接收边发送

CTPIO为什么快

DMA 路径:

  1. CPU在主机内存里面构造好包
  2. CPU 写 desc 告诉 NIC 包位置
  3. CPU 写 Doorbell 寄存器(通知NIC desc 就绪)
  4. NIC DMA 引擎构造 Memory Read TLP
  5. PCIe 往返:NIC,CPU/Root complex,内存控制器,DRAM,读回数据
  6. NIC DMA 引擎把数据搬进内部TX FIFO
  7. NIC MAC 引擎从TX FIFO 取出,发到网线

PIO 路径:

  1. CPU在寄存器/缓存里构造包数据
  2. CPU执行 MOV 到 MMIO 地址(NIC BAR 映射的 TX FIFO)
  3. PCIe memory write TLP 把数据送到NIC
  4. NIC 直接把数据放进TX 管线(CTPIO 还是边写边发)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注