【RDMA】10. RDMA之Completion Queue

原文:9. RDMA之Queue Pair - 知乎https://zhuanlan.zhihu.com/p/259650980

我们曾经在前面的文章中简单介绍过CQ,本文将更深入的讲解关于它的一些细节。阅读本文前,读者可以先温习一下这篇文章:

3. RDMA基本元素349 赞同 · 127 评论文章

基本概念

我们先回顾下CQ的作用。CQ意为完成队列,它的作用和WQ(SQ和RQ)相反,硬件通过CQ中的CQE/WC来告诉软件某个WQE/WR的完成情况。再次提醒读者,对于上层用户来说一般用WC,对于驱动程序来说,一般称为CQE,本文不对两者进行区分。

CQE可以看作一份“报告”,其中写明了某个任务的执行情况,其中包括:

  • 本次完成了哪个QP的哪一个WQE指定的任务(QP Number和WR ID)
  • 本次任务执行了什么操作(Opcode操作类型)
  • 本次任务执行成功/失败,失败原因是XXX(Status状态和错误码)
  • ...

每当硬件处理完一个WQE之后,都会产生一个CQE放在CQ队列中。如果一个WQE对应的CQE没有产生,那么这个WQE就会一直被认为还未处理完,这意味着什么呢?

  • 涉及从内存中取数据的操作(SEND和WRITE)

在产生CQE之前,硬件可能还未发送消息,可能正在发送消息,可能对端有接收到正确的消息。由于内存区域是在发送前申请好的,所以上层软件收到对应的CQE之前,其必须认为这片内存区域仍在使用中,不能将所有相关的内存资源进行释放。

  • 涉及向内存中存放数据的操作(RECV和READ)

在产生CQE之前,有可能硬件还没有开始写入数据,有可能数据才写了一半,也有可能数据校验出错。所以上层软件在获得CQE之前,这段用于存放接收数据的内存区域中的内容是不可信的。

总之,用户必须获取到CQE并确认其内容之后才能认为消息收发任务已经完成。

何时产生

我们将按照服务类型(本篇只讲RC和UD)和操作类型来分别说明,因为不同的情况产生CQE的时机和含义都不同,建议读者回顾第4篇和第5篇。

4. RDMA操作类型225 赞同 · 155 评论文章

5. RDMA基本服务类型205 赞同 · 74 评论文章

  • 可靠服务类型(RC)

前面的文章说过,可靠意味着本端关心发出的消息能够被对端准确的接收,这是通过ACK、校验和重传等机制保证的。

  • SEND
    SEND操作需要硬件从内存中获取数据,然后组装成数据包通过物理链路发送到对端。对SEND来说,Client端产生CQE表示对端已准确无误的收到数据,对端硬件收到数据并校验之后,会回复ACK包给发送方。发送方收到这ACK之后才会产生

posted on 2024-12-05 00:23  bdy  阅读(12)  评论(0)    收藏  举报  来源

导航