当前位置: 首页 > 工具软件 > cq > 使用案例 >

rdma-轮询常用cq函数。

厍建义
2023-12-01

ibv_req_notify_cq

int ibv_req_notify_cq(struct ibv_cq *cq, int solicited_only)

参数:

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

返回值

成功返回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)

参数:

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

返回值

成功返回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)

参数

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)

参数

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。

 类似资料: