哈哈哈,今天我们把下面这张图理解了,我们的任务就完成了!
视频教程在这:1.2 RDMA基本元素和组成 通信过程元素关系解析_哔哩哔哩_bilibili
一、WQ和WQE
工作队列元素(work queue element,WQE):是软件下发给硬件的任务:软件希望硬件完成的任务,例如:远程读\写,发送\接收等,以及有关该任务的详细信息(数据所在地址、数据长度、秘钥等)。
工作队列(Work Queue, WQ):可容纳多个工作队列元素WQE,WQE是WQ中的一个元素。
二、QP和QPN
QP对(Queue Pair,QP):包含一个发送队列SQ(send queue)和一个接收队列RQ(reveive queue),其实就是两个WQ。发送队列发送请求RDMA操作的出站消息。接收队列接收传入消息或即时数据。
一次发送和接收过程中,发送端软件需将一个发送任务WQE放到SQ中。接收端软件需将一个接收任务WQE放到RQ中,这样硬件才知道接收到的数据保存到内存中的哪个位置。
QP编号(Queue Pair number,QPN):RDMA节点上每个QP对都有一个唯一的编号QPN来标识它。
在RDMA技术中,通信的主体是QP,而不是节点(每个节点可以申请和使用多个QP),本地的一个QP可以连接到一个远端的QP,如下图所示。描述一次RDAM通信“节点A发送数据给节点B”,更精确的描述是“节点A的QP2发送数据给节点B的QP0”。
三、CQ和CQN
完成队列元素(completion queue element,CQE): WQE是软件下发给硬件的任务,CQE是硬件完成任务后返回给软件的完成报告。
完成队列(completion queue,CQ):类似WQ中含有多个WQE,CQ中含有多个CQE(completion queue element,完成队列要素)。
完成队列编号(completion queue number, CQN):DMA节点上每个CQ对都有一个唯一的编号CQN来标识它。
四、WR和WC
工作请求(work request, WR):由用户发布到工作队列的请求。
工作完成(work completion, WC):提示用户工作完成。
工作队列元素WQE和完成队列元素CQE在驱动层,本身对用户并不可见。WR和WC分别是WQE和CQE在用户层的映射。WR/WC和WQE/CQE是相同概念在不同层次的体现,用户直接通过API下发的是WR和WC。
五、总结
哈哈哈,最后再看这张图!
1、用户(应用程序)下发个工作请求WR1
2、WR1在驱动层被映射为工作队列元素WQE1,放入发送队列SQ中,让硬件去完成任务。
3、硬件完成任务,返回完成队列元素CQE1,放入完成队列CQ0。
4、CQE1在用户层被映射为工作完成WC1,通知用户(应用程序)任务完成。
参考资料:
Linux高性能网络详解,从DPDP、RDMA到XDP