RDMA内核态函数ib_post_recv()源码分析

2024-02-26 01:52

本文主要是介绍RDMA内核态函数ib_post_recv()源码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接上文,上文分析了内核rdma向发送队列添加发送请求的函数ib_post_send,本文分析一下向接收队列添加接收请求的函数ib_post_recv。其实函数调用流程与上文类似,不再重复说明,可参考链接。
函数调用过程

最终会调用到这个函数
在这里插入图片描述
下面是这个函数的完整代码

int mlx5_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,const struct ib_recv_wr **bad_wr, bool drain)
{struct mlx5_ib_qp *qp = to_mqp(ibqp);struct mlx5_wqe_data_seg *scat;struct mlx5_rwqe_sig *sig;struct mlx5_ib_dev *dev = to_mdev(ibqp->device);struct mlx5_core_dev *mdev = dev->mdev;unsigned long flags;int err = 0;int nreq;int ind;int i;if (unlikely(mdev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR &&!drain)) {*bad_wr = wr;return -EIO;}if (qp->type == IB_QPT_GSI)return mlx5_ib_gsi_post_recv(ibqp, wr, bad_wr);spin_lock_irqsave(&qp->rq.lock, flags);ind = qp->rq.head & (qp->rq.wqe_cnt - 1);for (nreq = 0; wr; nreq++, wr = wr->next) {if (mlx5_wq_overflow(&qp->rq, nreq, qp->ibqp.recv_cq)) {err = -ENOMEM;*bad_wr = wr;goto out;}if (unlikely(wr->num_sge > qp->rq.max_gs)) {err = -EINVAL;*bad_wr = wr;goto out;}scat = mlx5_frag_buf_get_wqe(&qp->rq.fbc, ind);if (qp->flags_en & MLX5_QP_FLAG_SIGNATURE)scat++;for (i = 0; i < wr->num_sge; i++)set_data_ptr_seg(scat + i, wr->sg_list + i);if (i < qp->rq.max_gs) {scat[i].byte_count = 0;scat[i].lkey       = cpu_to_be32(MLX5_INVALID_LKEY);scat[i].addr       = 0;}if (qp->flags_en & MLX5_QP_FLAG_SIGNATURE) {sig = (struct mlx5_rwqe_sig *)scat;set_sig_seg(sig, qp->rq.max_gs);}qp->rq.wrid[ind] = wr->wr_id;ind = (ind + 1) & (qp->rq.wqe_cnt - 1);}out:if (likely(nreq)) {qp->rq.head += nreq;/* Make sure that descriptors are written before* doorbell record.*/wmb();*qp->db.db = cpu_to_be32(qp->rq.head & 0xffff);}spin_unlock_irqrestore(&qp->rq.lock, flags);return err;
}

然后介绍一下这个函数:
1.参数。ibqp:指向一个IB队列对(Queue Pair)结构体的指针,表示待操作的队列对。
wr:指向接收请求工作请求(Work Request)链表的指针,即待投递的接收请求。
bad_wr:指向指针的指针,用于指示投递失败的工作请求。
drain:一个布尔值,指示是否需要在设备处于内部错误状态时尝试清空队列。

2.函数从ibqp中获取到对应的mlx5_ib_qp结构体,并获取其所属的设备和设备对象。如果设备处于内部错误状态且不需要排空队列,则函数将返回错误并将bad_wr指向当前的工作请求,否则继续执行。如果队列类型为GSI(General Services Interface),则调用特定的函数处理接收请求,并返回。然后,函数获取队列的锁,并初始化一些变量。

3.接着,遍历接收请求链表,依次处理每个接收请求:
检查队列是否溢出,如果溢出则返回错误。检查接收请求中的散射-聚集元素(Scatter-Gather Elements,SGE)数量是否超过队列的最大值,如果超过则返回错误。为接收请求获取一个WQE(Work Queue Element)缓冲区,并填充数据段。如果启用了数据完整性校验,则设置签名段。将接收请求的ID写入队列的WQE中。更新索引以指向下一个WQE。最后,如果成功处理了接收请求,则更新队列头,并确保在更新完成后再写入门铃寄存器,然后释放队列的锁。

这篇关于RDMA内核态函数ib_post_recv()源码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747371

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit