目录

ibv_get_cq_event

概要

描述

返回值

提示

ibv_ack_cq_events

描述

参数

返回值

例子

常见问题


ibv_get_cq_event

ibv_get_cq_event,ibv_ack_cq_events-获取和确认完成队列(CQ)事件

(注意调用ibv_get_cq_event之前需要调用ibv_req_notify_cq才能得到event,见:【vbers】ibv_req_notify_cq()_bandaoyu的note-CSDN博客)

概要

#include <infiniband / verbs.h>

int ibv_get_cq_event(struct ibv_comp_channel * channel, struct ibv_cq ** cq,void ** cq_context);

void ibv_ack_cq_events(struct ibv_cq * cq,unsigned int nevents);

描述

ibv_get_cq_event()等待事件通道channel中的下一个完成事件。用获取事件的CQ填充参数cq,并用CQ的上下文填充cq_context。

ibv_ack_cq_events()确认 cq上的nevents事件CQ。

返回值

ibv_get_cq_event()成功返回0,错误返回-1。

ibv_ack_cq_events()不返回任何值。

提示

ibv_get_cq_events()返回的所有完成事件必须使用ibv_ack_cq_events()进行确认。

为了避免竞争,销毁CQ将等待所有完成事件得到确认;这保证了在成功与成功之间一对一的对应关系。

在数据路径中调用ibv_ack_cq_events()可能相对昂贵,因为它必须使用互斥量。因此,最好是通过对需要确认的事件数量进行计数并在对ibv_ack_cq_events()的一次调用中同时确认几个完成事件来分摊此成本。

ibv_ack_cq_events

原文original:ibv_ack_cq_events() - RDMAmojo RDMAmojo

描述

ibv_ack_cq_events()确认完成事件(acknowledge Completion events.)。
为了防止竞争,使用ibv_get_cq_event()读取的所有完成事件 必须使用ibv_ack_cq_events()确认。
在数据路径中调用ibv_ack_cq_events()可能相对昂贵,因为它使用互斥对象。因此,最好通过对需要确认的事件进行计数,然后再调用ibv_ack_cq_events()一次性确认多个完成事件分摊成本

参数

Name Direction Description
cq in 从ibv_create_cq()返回的CQ
nevents in

要确认的完成事件数。(Number of Completion events to acknowledge)

返回值

无 (此功能始终成功)。

例子

read完成事件并确认它:

struct ibv_context *context;
struct ibv_cq *cq;
void *ev_ctx = NULL; /* can be initialized with other values for the CQ context *//* Create a CQ, which is associated with a Completion Event Channel */
cq = ibv_create_cq(ctx, 1, ev_ctx, channel, 0);
if (!cq) {fprintf(stderr, "Failed to create CQ\n");return -1;
}/* Request notification before any completion can be created (to prevent races) */
ret = ibv_req_notify_cq(cq, 0);
if (ret) {fprintf(stderr, "Couldn't request CQ notification\n");return -1;
}.
. /* Perform an operation that will eventually end with Work Completion */
./* The following code will be called each time you need to read a Work Completion */
struct ibv_cq *ev_cq;
void *ev_ctx;
int ret;
int ne;/* Wait for the Completion event */
ret = ibv_get_cq_event(channel, &amp;ev_cq, &amp;ev_ctx);
if (ret) {fprintf(stderr, "Failed to get CQ event\n");return -1;
}/* Request notification upon the next completion event */
ret = ibv_req_notify_cq(ev_cq, 0);
if (ret) {fprintf(stderr, "Couldn't request CQ notification\n");return -1;
}/* Empty the CQ: poll all of the completions from the CQ (if any exist) */
do {ne = ibv_poll_cq(cq, 1, &amp;wc);if (ne &lt; 0) {fprintf(stderr, "Failed to poll completions from the CQ: ret = %d\n",ne);return -1;}/* there may be an extra event with no completion in the CQ */if (ne) {if (wc.status != IBV_WC_SUCCESS) {fprintf(stderr, "Completion with status 0x%x was found\n",
wc.status);return -1;}}
} while (ne);/* Ack the event */
ibv_ack_cq_events(ev_cq, 1);

常见问题

为什么无论如何需要调用ibv_ack_cq_events()?

使用此verb 函数是为了防止内部竞争。

如果我不确认所有完成事件会怎样?

如果一个人不确认他使用ibv_get_cq_event()读取的所有完成事件,则销毁获得事件的CQ将永远被阻塞。此行为是为了防止出现 对 已被破坏的资源 进行确认(的情况)。

如果我读取一个完成事件,但在确认事件之前我的进程被有意地终止(例如,通过调用exit())或无意地终止(例如,段错误),将会发生什么情况?

即使有任何未确认的完成事件,当进程终止时,无论原因如何,所有资源都将被清除。

我应该一个接一个地确认完成事件,还是一次确认几个完成事件?

确认完成事件需要使用互斥对象,因此强烈建议一次确认多个完成事件(尤其是在数据路径中)。

【verbs】ibv_get_cq_event|ibv_ack_cq_events()相关推荐

  1. 【verbs】ibv_get_async_event()

    原文:ibv_get_async_event() - RDMAmojo RDMAmojo 描述 ibv_get_async_event() 读取 RDMA 设备上下文context的下一个异步事件. ...

  2. 【verbs】ibv_create_comp_channel()

    原文:ibv_create_comp_channel() - RDMAmojo RDMAmojo 描述 ibv_create_comp_channel() 为 RDMA 设备上下文创建完成事件通道. ...

  3. 【verbs】ibv_req_notify_cq()

    ibv_req_notify_cq() - RDMAmojo RDMAmojo 描述 ibv_req_notify_cq() 在完成队列 (CQ) 上请求Completion Notification ...

  4. 【RDMA】12. RDMA之Verbs|OFED

    目录 verbs源码 相关名词解释 Verbs API是什么 设计Verbs API的原因 Verbs API所包含的内容 使用Verbs API编写RDMA应用程序 官方示例程序 参考文献 [RDM ...

  5. 【RDMA】RDMA编程 和相关资料

    目录 RDMA的学习环境搭建 RDMA与socket的类比 RDMA编程流程 RDMA编程2 RDMA学习路线总结 简介--什么是rdma 编程环境 推荐编程库 编程参考手册 相关资料和代码参考 rd ...

  6. 【RDMA】RDMA 编程实例(rdma_cm API)

    目录 RDMA编程基础 说明 1. RDMA的学习环境搭建 2. RDMA与socket的类比 3. RDMA服务器的代码流程 main() { } 实例 用法 Makefile 服务端server. ...

  7. 【推荐】LSI(latent semantic indexing) 完美教程

    [推荐]LSI(latent semantic indexing) 完美教程 "instead of lecturing about SVD I want to show you how t ...

  8. 【写作】Texlive和Texmaker学习

    前言 最近要看一些论文做一下笔记,所以准备使用一下比较流行的Texlive和Texmaker写一下.其实CSDN的Markdown也是不错滴. 首先国际惯例,贴几个地址: Texlive镜像下载地址: ...

  9. 【RDMA】19. RDMA之iWARP Soft-iWARP

    [RDMA]RDMA 学习资料总目录_bandaoyu的博客-CSDN博客SavirRDMA 分享1. RDMA概述https://blog.csdn.net/bandaoyu/article/det ...

最新文章

  1. ASN.1 Editor
  2. 涨点小姿势 奥迪TFSI前面数字是什么
  3. 小牛带你nginx反向代理中神奇的斜线
  4. kubectl apply -f_广州车展捷豹路虎参展阵容 全新F-PACE 路虎卫士90
  5. 使用中断后不停止_乔丹体育公司构成侵权,为何又不判令彻底停止使用“乔丹”注册商标?法院解释来了...
  6. Bootstrap3 带提示的进度条
  7. 什么是Maven以及Maven的优点有哪些?
  8. 7款很棒的 HTML5 视频播放器
  9. OpenStack互操作性认证 为何有UnitedStack?
  10. 提高Office2010等高版的启动速度文章链接收集-Office2010打开慢速度怎么办?
  11. admixture软件_使用ADMIXTURE进行群体结构分析
  12. 移动应用商店比较分析
  13. XP/WIN7系统中删除已结束进程托盘图标的方法
  14. nexus上传Jar包Anti cross-site request forgery token mismatch
  15. 箫演奏技巧符号大全图解
  16. 桌面上出现两个计算机图标,电脑桌面图标出现成双显示要怎么解决
  17. php上传带进度条_PHP+Ajax无刷新带进度条图片上传示例
  18. 黑镜狗再现!波士顿动力「大黄狗」上岗SpaceX,勘察火箭爆炸现场
  19. 【基础】信息时代与计算机
  20. c语言中max代表什么,什么是C中的DBL_MAX?

热门文章

  1. ISP Tuning之路:初识ADRC
  2. N70/N72常见问题汇总
  3. 新零售智慧门店是什么 新零售智慧门店如何建设
  4. Nacos出现重大安全漏洞,开源项目险遭脱库
  5. AC旁挂式组网的思路
  6. 2020历年真题全解析【数学一】-汤家凤【上册(1987-1999年)】
  7. python unicodeencodeerror_Python发起请求提示UnicodeEncodeError错误代码怎么办
  8. 栈:栈的基本操作总结
  9. Java实现解压缩文件和文件夹
  10. cisco命令防ping_Cisco基本命令配置