描述
ibv_create_comp_channel() 为 RDMA 设备上下文创建完成事件通道。
这个 Completion event channel是 libibverbs(库) 引入的抽象,在 InfiniBand 架构verbs规范或 RDMA 协议verbs规范中不存在。 Completion event channel本质上是文件描述符,用于向用户空间进程传递工作完成通知。当为完成队列 (CQ) 生成‘工作完成’事件时,该事件通过附加到该 CQ 的 Completion event channel传递。这可能有助于通过使用多个 Completion event channel将完成事件引导到不同的线程,或者为不同的 CQ 赋予不同的优先级。
一个或多个完成队列(CQ)可以与同一个Completion event channel相关联。
参数
Name | Direction | Description |
context | in | ibv_open_device()返回的 RDMA 设备上下文 |
返回值
例子
创建一个Completion event channel并销毁它:
struct ibv_comp_channel *event_channel;
event_channel = ibv_create_comp_channel(context);
if (!event_channel) {
fprintf(stderr, "Error, ibv_create_comp_channel() failed\n");
return -1;
}
if (ibv_destroy_comp_channel(event_channel)) {
fprintf(stderr, "Error, ibv_destroy_comp_channel() failed\n");
return -1;
}
常见问题
为什么 Completion event channel无论如何都有用?
Completion event channel是一个对象,它使用事件模式而不是轮询模式帮助处理用户空间进程中的'工作完成'(WC)。
为什么我要在事件模式下read '工作完成'(WC)?
如果您的进程不需要低延迟或需要降低 CPU 使用率,则事件模式更好;在没有事件到来时,read线程将进入睡眠状态,当 CQ 中有新的WC生成时,线程被内核唤醒。(估计是把Completion event channel当条件变量,线程在Completion event channel上wait,WC到来时候,唤醒wait)
是否可以将多个 CQ 与同一个 Completion event channel相关联?
是的。多个 CQ 可以与同一个Completion event channel相关联。
(也)可以使用多个Completion event channel来“聚合”不同的 CQ。这可能有助于通过使用多个Completion event channel将完成事件引导到不同的线程,或者为不同的 CQ 赋予不同的优先级。
(估计是不同的Completion event channel绑定到不同等级的CQ,然后对应等级的线程wait在不同的Completion event channel上)
如何使用多个Completion event channel来为不同的 CQ 赋予不同的优先级?
您可以将所有具有相同优先级的 CQ 关联到同一个Completion event channel,并根据 CQ 组的优先级处理 Work Completion 事件。