• rdma-轮询常用cq函数。


    ibv_req_notify_cq

    int ibv_req_notify_cq(struct ibv_cq *cq, int solicited_only)
    
    • 1

    参数:

    cq from ibv_create_cq
    solicited_only  only notify if WR is flagged as solicied(一般给0)
    
    • 1
    • 2

    返回值

    成功返回0,失败返回-1.

    描述

    ibv_req_notify_cq为指定的完成队列(CQ)提供通知机制。当在CQ上放置一个完成队列条目(CQE)时,一个完成事件将被发送到与CQ相关联的完成通道(CC)。
    如果该CQ中已经有一个CQE,则不会为该事件生成事件。如果设置了solicited_only标志,那么只有设置了已请求标志的WRs的cq才会触发通知。
    用户应该使用ibv_get_cq_event操作来接收通知。通知机制将只针对一个通知。
    一旦发送了通知,必须用对ibv_req_notify_cq的新调用重新武装该机制。

    ibv_get_cq_event(阻塞)

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

    参数:

    channel  from ibv_create_comp_channel
    cq 和事件相关的cp,后面一般用于ibv_poll_cq等。
    cq_context(这个参数好像一般用不上)
    
    • 1
    • 2
    • 3

    返回值

    成功返回0,失败返回-1.

    描述

    ibv_get_cq_event等待在指定的完成通道(CC)上发送通知。
    注意,这是一个阻塞操作。用户应该分配指向结构ibv_cq和结构
    要传递给函数的Void。返回时将用适当的值填充它们。释放这些指针是用户的责任。
    必须用ibv_ack_cq_events操作确认发送的每个通知。
    Ibv_destroy_cq操作等待所有事件被确认,如果任何事件没有被正确确认,它将挂起
    一旦一个完成队列(CQ)的通知被发送到一个CC上,该CQ现在被“解除武装”和将不会向CC发送任何通知,直到它重新武装与新的调用ibv_req_notify_cq操作。
    此操作只通知用户CQ有要处理的完成队列条目(CQE),而不实际处理CQ。用户应该使用ibv_poll_cq操作来处理cq。

    如果设置非阻塞也是可以的,参考https://www.rdmamojo.com/2013/03/09/ibv_get_cq_event/的描述:
    根据使用ibv_req_notify_cq()为特定的完成事件通道请求的完成事件类型,ibv_get_cq_event()等待下一个完成事件。
    默认情况下,ibv_get_cq_event()是一个阻塞函数,如果没有任何Completion事件要读取,它将等待生成下一个Completion事件。有一个专门的线程来等待下一个Completion事件的发生是很有用的。然而,如果希望以非阻塞的方式读取事件,这是可以做到的。可以使用fcntl()将完成事件通道中事件文件的文件描述符配置为非阻塞的,然后使用read()/poll()/epoll()/select()读取该文件描述符,以确定是否有等待读取的完成事件。在这篇文章中有一个如何做到这一点的例子。
    所有使用ibv_get_cq_event()接收的完成事件都必须使用ibv_ack_cq_events()进行确认。

    ibv_ack_cq_events

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

    参数

    cq: from ibv_create_cq
    nevents: (用于确认一个cq事件,一般给1)

    描述

    ibv_ack_cq_events确认从ibv_get_cq_event接收到的事件。尽管从ibv_get_cq_event接收到的每个通知只算作一个事件,但用户可以确认
    通过对ibv_ack_cq_events的单个调用实现多个事件。要确认的事件数量在事件中传递,并且应该至少为1。
    因为这个操作需要一个互斥锁,所以它的开销比较大,并且在一个调用中确认多个事件可以提供更好的性能。有关更多详细信息,请参见ibv_get_cq_event。

    ibv_poll_cq

    int ibv_poll_cq(struct ibv_cq *cq, int num_entries, struct ibv_wc *wc)
    
    • 1

    参数

    cq – from ibv_create_cq
    num_entries – 完成队列里面最大的CQE数量(ibv_poll_cq函数返回时/返回值)
    wc:用于处理的信息用这个结构体里面取出

    返回值

    失败返回-1,成功返回值一般等于num_entries

    描述

    ibv_poll_cq从完成队列(CQ)检索CQ。用户应该分配结构ibv_wc的数组,并将其传递给wc中的调用。
    wc中可用的条目数量应该在num_entries中传递。释放这个内存是用户的责任。

    实际检索的cq的数量作为返回值给出。cq必须定期轮询,以防止溢出。
    如果出现溢出,则CQ将会关闭,将发送一个异步事件IBV_EVENT_CQ_ERR。

  • 相关阅读:
    srpingMVC基本使用
    微信公众号如何上传文档附件_公众号添加Excel、PDF、PPT等附件教程
    Redis
    Vue中path和component属性
    Uniapp零基础开发学习笔记(2) - 简单格式检查和事件响应
    字符串左旋解法和子字符串判断法
    Python之类对象
    .NET生成MongoDB中的主键ObjectId
    《吐血整理》高级系列教程-吃透Fiddler抓包教程(25)-Fiddler如何优雅地在正式和测试环境之间来回切换-下篇
    《向量数据库》——Zilliz X Dify.AI ,快速打造知识库 AI 应用
  • 原文地址:https://blog.csdn.net/qq_38158479/article/details/127638425