【vbers】ibv_poll_cq()|RDMA_work request flushed error-程序员宅基地

技术标签: RDMA  

目录

描述

参数

返回值

例子

常见问题


原文:https://www.rdmamojo.com/2013/02/15/ibv_poll_cq/  (强烈建议去看原文)

描述


ibv_poll_cq()从完成队列(CQ)轮询WC(工作完成),非阻塞函数。

[工作完成] 表示 WQ(工作队列)中的WR(工作请求) 以及与CQ相关联的所有已发布到该工作队列的未发出信号的WR(工作请求)均已完成。

(A Work Completion indicates that a Work Request in a Work Queue, and all of the outstanding unsignaled Work Requests that posted to that Work Queue, associated with the CQ are done.)

任何发送和接收请求 以及以错误结束的发送请求,将在处理结束后生成WC(工作完成)。

(Any Receive Requests, signaled Send Requests and Send Requests that ended with an error will generate a Work Completion after their processing end.)

当[工作请求]结束时,会将[工作完成]添加到与此工作队列相关联的CQ的尾部。 ibv_poll_cq()检查CQ中是否存在[工作完成],并按其输入顺序从CQ的顶部弹出(FIFO)。从CQ弹出[工作完成]后,无法将其返回给CQ。

应该以比产生WC更快的速度消费CQ中的WC,防止CQ队列溢出,如果发生CQ溢出,将触发异步事件IBV_EVENT_CQ_ERR,并且无法再使用CQ。

参数

Name Direction Description
cq in

从ibv_create_cq()返回的CQ

num_entries in

期望从CQ读取的WC数

wc out

从CQ读取的WC数num_entries的数组。(Array of size num_entries of the Work Completions that will be read from the CQ)

结构ibv_wc描述了wc的属性。

struct ibv_wc {
    uint64_t        wr_id;
    enum ibv_wc_status    status;
    enum ibv_wc_opcode    opcode;
    uint32_t        vendor_err;
    uint32_t        byte_len;
    uint32_t        imm_data;
    uint32_t        qp_num;
    uint32_t        src_qp;
    int            wc_flags;
    uint16_t        pkey_index;
    uint16_t        slid;
    uint8_t            sl;
    uint8_t            dlid_path_bits;
};

这是struct ibv_wc的完整说明:

wr_id

与WR对应关联的64 bit值 (The 64 bits value that was associated with the corresponding Work Request)

status

Status of the operation. The value can be one of the following enumerated values and their numeric value:

操作状态。该值可以是下列枚举值及其数字值之一:

  • IBV_WC_SUCCESS (0) - Operation completed successfully: this means that the corresponding Work Request (and all of the unsignaled Work Requests that were posted previous to it) ended and the memory buffers that this Work Request refers to are ready to be (re)used.
  • IBV_WC_LOC_LEN_ERR (1) - Local Length Error: this happens if a Work Request that was posted in a local Send Queue contains a message that is greater than the maximum message size that is supported by the RDMA device port that should send the message or an Atomic operation which its size is different than 8 bytes was sent. This also may happen if a Work Request that was posted in a local Receive Queue isn't big enough for holding the incoming message or if the incoming message size if greater the maximum message size supported by the RDMA device port that received the message.
  • IBV_WC_LOC_QP_OP_ERR (2) - Local QP Operation Error: an internal QP consistency error was detected while processing this Work Request: this happens if a Work Request that was posted in a local Send Queue of a UD QP contains an Address Handle that is associated with a Protection Domain to a QP which is associated with a different Protection Domain or an opcode which isn't supported by the transport type of the QP isn't supported (for example: RDMA Write over a UD QP).
  • IBV_WC_LOC_EEC_OP_ERR (3) - Local EE Context Operation Error: an internal EE Context consistency error was detected while processing this Work Request (unused, since its relevant only to RD QPs or EE Context, which aren’t supported).
  • IBV_WC_LOC_PROT_ERR (4) - Local Protection Error: the locally posted Work Request’s buffers in the scatter/gather list does not reference a Memory Region that is valid for the requested operation.
  • IBV_WC_WR_FLUSH_ERR (5) - Work Request Flushed Error: A Work Request was in process or outstanding when the QP transitioned into the Error State.
  • IBV_WC_MW_BIND_ERR (6) - Memory Window Binding Error: A failure happened when tried to bind a MW to a MR.
  • IBV_WC_BAD_RESP_ERR (7) - Bad Response Error: an unexpected transport layer opcode was returned by the responder. Relevant for RC QPs.
  • IBV_WC_LOC_ACCESS_ERR (8) - Local Access Error: a protection error occurred on a local data buffer during the processing of a RDMA Write with Immediate operation sent from the remote node. Relevant for RC QPs.
  • IBV_WC_REM_INV_REQ_ERR (9) - Remote Invalid Request Error: The responder detected an invalid message on the channel. Possible causes include the operation is not supported by this receive queue (qp_access_flags in remote QP wasn't configured to support this operation), insufficient buffering to receive a new RDMA or Atomic Operation request, or the length specified in a RDMA request is greater than 2^{31} bytes. Relevant for RC QPs.
  • IBV_WC_REM_ACCESS_ERR (10) - Remote Access Error: a protection error occurred on a remote data buffer to be read by an RDMA Read, written by an RDMA Write or accessed by an atomic operation. This error is reported only on RDMA operations or atomic operations. Relevant for RC QPs.
  • IBV_WC_REM_OP_ERR (11) - Remote Operation Error: the operation could not be completed successfully by the responder. Possible causes include a responder QP related error that prevented the responder from completing the request or a malformed WQE on the Receive Queue. Relevant for RC QPs.
  • IBV_WC_RETRY_EXC_ERR (12) - Transport Retry Counter Exceeded: The local transport timeout retry counter was exceeded while trying to send this message. This means that the remote side didn't send any Ack or Nack. If this happens when sending the first message, usually this mean that the connection attributes are wrong or the remote side isn't in a state that it can respond to messages. If this happens after sending the first message, usually it means that the remote QP isn't available anymore. Relevant for RC QPs.
  • IBV_WC_RNR_RETRY_EXC_ERR (13) - RNR Retry Counter Exceeded: The RNR NAK retry count was exceeded. This usually means that the remote side didn't post any WR to its Receive Queue. Relevant for RC QPs.
  • IBV_WC_LOC_RDD_VIOL_ERR (14) - Local RDD Violation Error: The RDD associated with the QP does not match the RDD associated with the EE Context (unused, since its relevant only to RD QPs or EE Context, which aren't supported).
  • IBV_WC_REM_INV_RD_REQ_ERR (15) - Remote Invalid RD Request: The responder detected an invalid incoming RD message. Causes include a Q_Key or RDD violation (unused, since its relevant only to RD QPs or EE Context, which aren't supported)
  • IBV_WC_REM_ABORT_ERR (16) - Remote Aborted Error: For UD or UC QPs associated with a SRQ, the responder aborted the operation.
  • IBV_WC_INV_EECN_ERR (17) - Invalid EE Context Number: An invalid EE Context number was detected (unused, since its relevant only to RD QPs or EE Context, which aren't supported).
  • IBV_WC_INV_EEC_STATE_ERR (18) - Invalid EE Context State Error: Operation is not legal for the specified EE Context state (unused, since its relevant only to RD QPs or EE Context, which aren't supported).
  • IBV_WC_FATAL_ERR (19) - Fatal Error.
  • IBV_WC_RESP_TIMEOUT_ERR (20) - Response Timeout Error.
  • IBV_WC_GENERAL_ERR (21) - General Error: other error which isn't one of the above errors.
opcode The operation that the corresponding Work Request performed. This value controls the way that data was sent, the direction of the data flow and the valid attributes in the Work Completion. The value can be one of the following enumerated values:

相应的工作请求执行的操作。此值控制数据的发送方式、数据流的方向以及“工作完成”中的有效属性。该值可以是下列枚举值之一:

  • IBV_WC_SEND - 已发布到“发送队列”中的WR的发送操作(Send operation for a WR that was posted to the Send Queue) 
  • IBV_WC_RDMA_WRITE - 已发布到发送队列的WR的RDMA写操作(RDMA Write operation for a WR that was posted to the Send Queue)
  • IBV_WC_RDMA_READ - 已发布到发送队列的WR的RDMA读取操作(RDMA Read operation for a WR that was posted to the Send Queue)
  • IBV_WC_COMP_SWAP - 已发布到“发送队列”中的WR的比较和交换操作(Compare and Swap operation for a WR that was posted to the Send Queue)
  • IBV_WC_FETCH_ADD - 已发布到发送队列的WR的获取和添加操作(Fetch and Add operation for a WR that was posted to the Send Queue)
  • IBV_WC_BIND_MW - 已发布到“发送队列”中的WR的“内存窗口”绑定操作(Memory Window bind operation for a WR that was posted to the Send Queue)
  • IBV_WC_RECV - 发送已发布到(QP或SRQ的)接收队列的WR的数据操作(Send data operation for a WR that was posted to a Receive Queue (of a QP or to an SRQ))
  • IBV_WC_RECV_RDMA_WITH_IMM -  发送到(QP或SRQ)的接收队列的WR的带立即数的RDMA。对于此操作码,仅消耗一个接收请求,并且未使用此RR的sg_list(RDMA with immediate for a WR that was posted to a Receive Queue (of a QP or to an SRQ). For this opcode, only a Receive Request was consumed and the sg_list of this RR wasn't used)
vendor_err

供应商特定的错误,如果completion 因错误而结束,则会提供更多信息。一旦WC以错误结束,该值向RDMA设备的供应商提供有关失败原因的提示。

byte_len

传输的字节数。与incoming Send或 RDMA Write with immediate operations的接收队列有关。该值不包括立即数的长度(如果存在)。与RDMA读取和原子操作的“发送队列”相关。对于不与SRQ关联的UD QP的接收队列,或者对于与UD QP关联的SRQ,该值等于消息的有效负载加上为GRH保留的40个字节。传输的字节数是消息的有效负载加上为GRH保留的40个字节(无论是否存在GRH)

(The number of bytes transferred. Relevant if the Receive Queue for incoming Send or RDMA Write with immediate operations. This value doesn't include the length of the immediate data, if such exists. Relevant in the Send Queue for RDMA Read and Atomic operations.For the Receive Queue of a UD QP that is not associated with an SRQ or for an SRQ that is associated with a UD QP this value equals to the payload of the message plus the 40 bytes reserved for the GRH.The number of bytes transferred is the payload of the message plus the 40 bytes reserved for the GRH, whether or not the GRH is present)

imm_data

(可选)以网络顺序的SEND或RDMA WRITE操作码中的32 bit 数字,与有效载荷一起发送到远程端,并放置在[接收工作完]( Receive Work Completion)成中,而不是在远端内存缓冲区中。如果设置了IBV_WC_WITH_IMM,则此值有效

qp_num

已完成的WR的本地QP的号码。与和SRQ相关的[接收工作完成](Receive Work Completions)相关.

(Local QP number of completed WR. Relevant for Receive Work Completions that are associated with an SRQ)

src_qp Source QP number (remote QP number) of completed WR. Relevant for Receive Work Completions of a UD QP
wc_flags Flags of the Work Completion. It is either 0 or the bitwise OR of one or more of the following flags:

  • IBV_WC_GRH - Indicator that GRH is present for a Receive Work Completions of a UD QP. If this bit is set, the first 40 bytes of the buffered that were referred to in the Receive request will contain the GRH of the incoming message. If this bit is cleared, the content of those first 40 bytes is undefined
  • IBV_WC_WITH_IMM - Indicator that imm_data is valid. Relevant for Receive Work Completions
pkey_index P_Key index. Relevant for GSI QPs
slid Source LID (the base LID that this message was sent from). Relevant for Receive Work Completions of a UD QP
sl Service Level (the SL LID that this message was sent with). Relevant for Receive Work Completions of a UD QP
dlid_path_bits Destination LID path bits. Relevant for Receive Work Completions of a UD QP (not applicable for multicast messages)

以下测试(opcode & IBV_WC_RECV)将指示 来自接收队列的完成状态。(The following test (opcode & IBV_WC_RECV) will indicate that the status of a completion is from the Receive Queue.)
对于UD QP的[接收工作完成](receive Work Completions),无论是否设置了IBV_WC_GRH位,数据均从已发布的接收缓冲区的偏移量40开始。
并非所有wc属性始终有效。如果完成状态不是IBV_WC_SUCCESS,则仅以下属性有效:

  • wr_id
  • status
  • qp_num
  • vendor_err

返回值

Value Description
正数

从CQ读取的WC数及其值在wc中返回。如果该值小于num_entries,则表示CQ中没有更多的工作完成。如果此值等于num_entries,则CQ中可能会有更多的工作完成

0 CQ为空
负数

尝试从CQ读取WC(工作完成)时发生故障

例子

从CQ轮询WC(工作完成)(在轮询模式下):

struct ibv_wc wc;

int num_comp;

 
do {
    num_comp = ibv_poll_cq(cq, 1, &wc);
} while (num_comp == 0);
 
if (num_comp < 0) {
    fprintf(stderr, "ibv_poll_cq() failed\n");
    return -1;
}
 
/* verify the completion status */
if (wc.status != IBV_WC_SUCCESS) {
    fprintf(stderr, "Failed status %s (%d) for wr_id %d\n", 
        ibv_wc_status_str(wc.status),
        wc.status, (int)wc.wr_id);
    return -1;
}

常见问题

那工作完成(WC)到底是什么?

工作完成意味着相应的工作请求已结束,缓冲区可以(重新)用于读取,写入或释放。

ibv_poll_cq()是否引起上下文切换?

否。Work Completions的轮询根本不会导致上下文切换;它不会导致上下文切换。这就是为什么RDMA技术可以实现极低的延迟(低于1 usc)的原因。

Is there a limit to the number of Work Completions that can we polled when calling ibv_poll_cq()?

调用ibv_poll_cq()时可以轮询的[工作完成](Work Completions 数量是否有限制?

没有,你想读多少都行。

我调用了ibv_poll_cq(),它填充了我提供给它的所有数组。我能否知道CQ中还有多少工作完成?

不,你不能。

我从UD QP的接收队列中获得了工作完成(WC),并且进展顺利。我从内存缓冲区中读取了数据,但数据不正确。为什么?

也许您查看了数据的起始偏移量0。对于UD QP的任何工作完成,无论是否存在GRH,数据都将放置在相关内存缓冲区的偏移量40中。


什么是GRH,为什么我需要它?
全局路由头(GRH)提供的信息对于将消息发回给此消息的发件人(如果来自其他子网或来自多播组)最有用。

I've got completion with error status. Can I read all of the Work Completion fields?


否。如果“工作完成”状态表明存在错误,则仅以下属性有效:wr_id,status,qp_num和vendor_err。其余属性未定义。

我从CQ上Read了一个WC,但我不需要,我可以将其退还给CQ吗?

不,你不能。

我可以阅读属于特定工作队列的工作完成吗?(Can I read Work Completion that belongs to a specific Work Queue?

不,你不能。


如果添加的工作完成(WC)数量超过CQ的size,将会发生什么情况?


CQ将超限,并且CQ(以及与之关联的所有QP)将进入错误状态。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bandaoyu/article/details/116493052

智能推荐

把组合损失中的权重设置为可学习参数-程序员宅基地

文章浏览阅读169次。目前的需求是:有一个模型,准备使用组合损失,其中有2个或者多个损失函数。准备对其进行加权并线性叠加。但想让这些权重进行自我学习,更新迭代成最优加权组合。

java等腰三角形代码-程序员宅基地

文章浏览阅读510次,点赞8次,收藏6次。然后使用两个嵌套的for循环来打印三角形的每一行。外层循环控制行数,内层循环分别负责打印空格和星号。等腰三角形是一种两边长度相等的三角形。这段代码首先定义了一个变量。_java等腰三角形代码

游戏中的AI和数据科学_游戏数据科学-程序员宅基地

文章浏览阅读844次。。。。。DataEngineer + SoftEngineer收集数据、报表、数据分析、产品化AI PVE研发AI测试Auto Feature起源世界 AiBotAI生成游戏内容具体示例:1. 算法:打关卡bot, 人工测,现在自动测。 推荐,AB测的提升。2. AB测试:买量的模型的优化,经济学因果推断。不同用户群的不同效果。留存的提升。3. 数据分析师 游戏机制分析:BP 优化建议,帮助策划优化增长点。奖励的力度、定价、排名榜单机制联动。设计复杂、_游戏数据科学

使用Windows 部署KMS服务器-程序员宅基地

文章浏览阅读1.3k次。开始KMS服务部署,进入系统后,Windows系统默认启动了Windows Defender 防火墙记得关闭,并且没有放行1688端口的入站流量(vlmcsd需要用到该端口),所以需要添加一条入站规则,放行。在下载的binaries.tar压缩包,找到intel目录下的所有文件解压或者复制到 C:\KMS 文件夹;、Key Management Server 服务启动后,可以到存放日志的目录查看是否生成日志文件;启动Key Management Server服务,查看服务并且为开机自启动;_kms服务器

c++顺序栈的实现_c++。请基于单向链表完成栈的主要功能, 栈的特点是先进后出(first input last ou-程序员宅基地

文章浏览阅读5k次,点赞7次,收藏22次。一.实验目的 巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题,巩固课堂学习。二. 实验内容1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。这里用顺序栈来实现。//// mai_c++。请基于单向链表完成栈的主要功能, 栈的特点是先进后出(first input last out

【Pytorch神经网络理论篇】 14 过拟合问题的优化技巧(一):基本概念+正则化+数据增大_pytorch 过拟合-程序员宅基地

文章浏览阅读4k次,点赞4次,收藏13次。1 过拟合问题的描述1.1 过拟合问题概述深度额学习训练过程中,在训练阶段得到了较好的准确率,但在识别非数据集数据时存在精度下降的问题,这种现象称为过拟合现象。主要原因:由于模型的拟合度过高,导致模型不仅学习样本的群体规律,也学习样本的个体规律。1.2 过拟合问题模型的设计1.2.1 构建数据集---Over_fitting.py(第1部分)import sklearn.datasetsimport torchimport numpy as npimport matpl_pytorch 过拟合

随便推点

XGB(有监督学习)和多维时序模型结合——预测风电出力_xgb模型-程序员宅基地

文章浏览阅读5k次,点赞5次,收藏60次。通过时序模型对多维度的传感器数据都预测出未来值,使用这个未来值作为XBG(有监督学的输入)更好的预测出风电机出力功率。_xgb模型

为什么说继承类没有继承父类的构造和析构函数_类继承会继承父类的构造方法吗-程序员宅基地

文章浏览阅读354次,点赞2次,收藏4次。当参数列表中没有表明父类的构造方式,如无参、带参,则会自动调用父类的无参构造;此时调用构造的特性跟平时实例化一个对象的特性一样,即当没有定义无参构造时,系统会自带无参构造、拷贝构造等等特性。没有继承,因为没有直接使用,只是通过子类的构造函数中参数列表,也就是通过自身的构造函数来间接调用的父类构造函数,析构函数也是同理。_类继承会继承父类的构造方法吗

Elasticsearch学习-程序员宅基地

文章浏览阅读63次。Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Elasticsearch是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。

【学习笔记】数据库MySQL_数据库学习笔记-程序员宅基地

文章浏览阅读801次。1、操作系统中数据存放的载体Windows、Linux和MacOS都是基于文件的操作系统2、什么是数据库系统?数据库系统(DBMS)是指一个能为用户提供信息服务的系统。它实现了有组织地、动态地存储大量相关数据的功能,提供了数据处理和信息资源共享的便利手段3、什么是关系型数据库系统?关系型数据库系统(RDBMS)是指使用了关系模型的数据库系统关系模型中,数据是分类存放的,数据之间可以有联系主流关系型数据库:DB2、Oracle、MysSQL、SQL Server4、什么是NoSQL数据库系统?_数据库学习笔记

计算机网络两个基本问题,计算机网络技术包含的两个主要技术是什么-程序员宅基地

文章浏览阅读2.4k次。计算机网络技术包含的两个主要技术是计算机技术和通信技术。计算机网络具有共享硬件、软件和数据资源的功能,具有对共享数据资源集中处理及管理和维护的能力。本文操作环境:windows10系统、thinkpad t480电脑。(学习视频分享:编程入门)计算机网络技术是通信技术与计算机技术相结合的产物。计算机网络是按照网络协议,将地球上分散的、独立的计算机相互连接的集合。连接介质可以是电缆、双绞线、光纤、微..._计算机网络格式包含的两个主要

創新組合型的架構設計(Part-5):以架構設計推動Agile敏捷_創新部架構-程序员宅基地

文章浏览阅读759次。相關文件:1.高老師的=>A段架構設計_雋語集2.高老師的新書《思考軟件,創新設計:A段架構師的思考技術》==>請看目錄 3.欢迎访问 =>高老师的ADT技术论坛EE EE _創新部架構