本文将mark下RDMA Direct WQE与Inline data机制,主要内容转载自知乎:RDMA 高级

Normal flow

以发包为例:

  1. 填充要发送的数据
  2. 填充WQE描述符
  3. 敲doorbell通知硬件有数据要发送
  4. 硬件通过DMA读取WQE
  5. 硬件通过DMA读取要发送的数据

Direct WQE

以发包为例:

与Normal flow相比,Direct WQE先将WQE写入MMIO bar中,再写doorbell通知硬件有数据要发送。这样RNIC就无需通过DMA来读取WQE了。

需要将MMIO页以write combining方式映射,这里的MMIO页属于RDMA Device Memory

Inline-Send


ibv_post_send时带上IBV_SEND_INLINE标识,如果要发送的数据小于128字节则填WQE时会将这部分数据直接append在WQE的后面。这样硬件DMA WQE时就顺便将data也读出来了,这样就省去了单独DMA data的操作。

Inline-Receive


与发送类似,如果接收的是一个小数据,则没有必要将其放入RQ的receive buffer中,而是可以直接将其放入CQE中。这可以省去硬件将数据DMA至RQ SGE list的过程。使用ibv_exp_create_qp创建QP时指定max_inl_recv即可开启此功能。

总结

Direct WQE与Inline data机制的目标都是减少RDMA数据面上的PCIe TLP交互次数。


参考资料:

  1. RDMA 高级
  2. Inline-Receive
  3. [rdma-core,4/4] libhns: Add support for direct wqe
  4. Design Guidelines for High Performance RDMA Systems(ATC’16)