内核版本低于6.12时,如何获取CQE对应的Buffer ID?
低版本内核(<6.12)下liburing获取Buffer ID的方法
在6.12之前的内核版本中,无法通过cqe->flags获取Buffer ID,必须借助cqe->user_data字段实现,核心思路是在提交SQE时手动将Buffer ID与自定义数据绑定,具体操作如下:
- 注册缓冲区阶段:为每个注册的缓冲区分配唯一ID(比如从0开始的递增整数),同时维护一份ID与缓冲区地址的映射表。
- 提交接收任务阶段:提交
IORING_OP_RECV或IORING_OP_RECVMSG任务时,将Buffer ID与你需要的自定义数据(如连接FD、请求标识等)一起编码到sqe->user_data中。比如用64位整数的高32位存Buffer ID,低32位存自定义数据,可根据实际需求调整拆分规则。 - 处理CQE阶段:收到完成事件后,直接从
cqe->user_data中解析出预先编码的Buffer ID,再通过映射表找到对应的缓冲区地址。
注意事项:
- 必须自行维护Buffer ID与缓冲区的映射关系,绝对不能假设内核会按注册顺序轮选缓冲区。
- 使用
IORING_RECV_FIXED_BUFFERflag让内核自动选缓冲区时,上述绑定操作是唯一能关联CQE与对应缓冲区的方式。
内容的提问来源于stack exchange,提问作者moose
相关产品推荐
相关产品推荐

