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。最后,如果成功处理了接收请求,则更新队列头,并确保在更新完成后再写入门铃寄存器,然后释放队列的锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch -- DataLoader

定义 提供了给定数据集的迭代器 torch.utils.data.DataLoader(dataset, batch_size1, 每次拿多少数据 shuffleNone, 是否打乱 samplerNone, batch_samplerNone, num_workers0, 多进程&#xff08;加载数据时采用&#xff09;默认是0,使用主进程加载数据 collate_fnNone, p…

【SpringBoot3】Spring Security使用mybatis-plus存储用户角色权限,实现动态权限处理

注&#xff1a;本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 相关文章 【SpringBoot3】Spring Security 核心概念 【SpringBoot3】Spring Security 常用注解 【SpringBoot3】Spring Security 详细使用实例&#xff08;简单使用、JWT模式&#xff09; 一、使用mybat…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-LDPC编码介绍(一)

概述 低密度校验码&#xff08;LDPC码&#xff09;是一种前向纠错码&#xff0c;LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出&#xff0c;但限于当时的技术条件&#xff0c;缺乏可行的译码算法&#xff0c;此后的35年间基本上被人们忽略&#xff0c;其间由Tanner…

轻松玩转树莓派Pico之九、RP2040-SMP自定义工程创建

[toc]## 1、工程创建 运行完 FreeRTOS-SMP-Demos 后&#xff0c;我们对 SMP 运行有了一定的了解&#xff0c;接下来我们自己创建工程编译运行。 按照前文 轻松玩转树莓派Pico之二、创建自己的pico工程项目 一文创建 pico_smp 项目。 创建 pico_smp.c&#xff0c;并输入&#x…

浅谈数据分析工具在智慧城市中的作用

随着城市化、技术进步和人口不断增长&#xff0c;智慧城市已成为当今世界主要技术发展之一。 智慧城市设备依靠描述模型对城市环境产生的大量数据进行数据分析。 在这种城市景观中&#xff0c;智慧城市是技术和可持续的城市地区&#xff0c;利用信息和通信技术(ICT)来改善城市…

C语言每日一题(61)盛最多水的容器

题目链接 力扣 11 盛最多水的容器 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水…

Eureka服务搭建

1️⃣搭建服务 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>启动类加注解 EnableEurekaServer SpringBootApplication public…

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…

基于Qt实现TCP和UDP客户端与服务端的完整指南

在当今的软件开发领域&#xff0c;网络通信已经成为了不可或缺的一部分。无论是在物联网(IoT)、企业级应用还是简单的客户端与服务端通信场景中&#xff0c;有效且高效的数据传输都是至关重要的。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;不仅提供了丰富的用户界面组件…

K线实战分析系列之十一:行情力量不足——平头形态

K线实战分析系列之十一&#xff1a;行情力量不足——平头形态 一、平头形态二、不同形态与平头形态的叠加三、总结平头形态 一、平头形态 前一根K线具有较长的实体&#xff0c;后一根K线的实体比较小&#xff0c;无论是多头还是空头的力量到第二根K线都被瓦解了多头上攻&#…

【数据结构与算法】(21)高级数据结构与算法设计之 Dynamic-Programming 动态规划算法 代码示例与详细讲解

目录 4.3 Dynamic-Programming1) Fibonacci降维 2) 最短路径 - Bellman-Ford3) 不同路径-Leetcode 62降维 4) 0-1 背包问题降维 5) 完全背包问题降维 6) 零钱兑换问题-Leetcode322降维零钱兑换 II-Leetcode 518 7) 钢条切割问题降维类似题目 Leetcode-343 整数拆分 8) 最长公共…

HashMap学习

hashmap 1、hashmap 与 hashtable 的区别2、hashmap基本类型与包装类常用实现变量介绍初始容量和负载因子红黑树和链表转化HashMap的内部数据结构HashMap内部哈希算法 参考文章 1、hashmap 与 hashtable 的区别 线程安全null值执行效率 2、hashmap hashmap是java中常用的集合…

寻找连续区间(C 语言)【数组区间处理】

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目 给定一个含有 N 个正整数的数组&#xff0c; 求出有多少个连续区间&#xff08;包括单个正整数&am…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

分库分表(以MySQL为例说明)

1、为什么要分库&#xff1f; ①减轻磁盘压力 ②单库并发连接请求数有限&#xff0c;如果存在过多连接会出现too many connections的问题 2、为什么要分表&#xff1f; ①一般单表数据量超千万很大了&#xff0c;单表数据量过大会出现性能瓶颈&#xff0c;建索引、SQL优化、数据…

tinymce问题处理

Vite构建工具下Tinymce踩坑指南 解决方案是在路劲前面增加/&#xff0c;这个跟上面链接有些区别&#xff0c;区别原因应该是如果路由采用的是createWebHashHistory则应该去掉/&#xff0c;如果是createWebHistory则应该加上/ 页面引用,一种异步加载&#xff0c;一种同步加载&…

深度学习的启航:从零到一的完全指南

深度学习的启航&#xff1a;从零到一的完全指南 深度学习近年来已成为人工智能领域最耀眼的明星&#xff0c;其在图像识别、自然语言处理、游戏以及无人驾驶等领域取得的进展令人瞩目。如果你对深度学习充满好奇&#xff0c;想要开启一段全新的学习旅程&#xff0c;这篇文章将…

睿易售前初级认证课程R1.0睿网络命名选型-2023练习题答案

1、RG-RAP6260(G)可以用在什么场景下?【多选题】 A、别墅花园 B、冷库 C、大型仓库 D、海边 A B C D 2、AP选型要关注什么?【多选题】 A、使用场景 B、带机量 C、Wi-Fi5还是Wi-Fi6 D、千兆还是百兆 A B C D 3、带机60终端以上的Wi-Fi6千兆吸顶AP选哪款【多选题】 A、…

LeetCode 热题 100 | 二叉树(二)

目录 1 543. 二叉树的直径 2 102. 二叉树的层序遍历 3 108. 将有序数组转换为二叉搜索树 菜鸟做题&#xff0c;语言是 C 1 543. 二叉树的直径 这道题和 124. 二叉树中的最大路径和 太像了 题眼&#xff1a;二叉树的 直径 是指树中任意两个节点之间 最长路径的长度 。…