【C语言】ipoib驱动 - ipoib_cm_post_receive_nonsrq_rss函数

一、ipoib_cm_post_receive_nonsrq_rss函数定义

static int ipoib_cm_post_receive_nonsrq_rss(struct net_device *dev,
					    struct ipoib_cm_rx *rx, int id)
{
	struct ipoib_dev_priv *priv = ipoib_priv(dev);
	struct ipoib_recv_ring *recv_ring = priv->recv_ring + rx->index;
	struct ib_sge *sge;
	struct ib_recv_wr *wr;
	int i, ret;

	sge = recv_ring->cm.rx_sge;
	wr = &recv_ring->cm.rx_wr;

	wr->wr_id = id | IPOIB_OP_CM | IPOIB_OP_RECV;

	for (i = 0; i < IPOIB_CM_RX_SG; ++i)
		sge[i].addr = rx->rx_ring[id].mapping[i];

	ret = ib_post_recv(rx->qp, wr, NULL);
	if (unlikely(ret)) {
		ipoib_warn(priv, "post recv failed for buf %d (%d)\n", id, ret);
		ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,
				      rx->rx_ring[id].mapping);
		dev_kfree_skb_any(rx->rx_ring[id].skb);
		rx->rx_ring[id].skb = NULL;
	}

	return ret;
}

二、解读

解读1

这段代码是Linux内核中的一个函数,用于在使用RDMA(远程直接内存访问)协议的InfiniBand网卡上进行接收数据。具体来说,这段代码用于在RDMA接收队列(rx->qp)上提交一个接收工作请求(wr),以便接收数据。

首先,函数从net_device结构体中获取与RDMA相关的私有数据结构ipoib_dev_priv。然后,它根据接收队列的索引(rx->index)获取接收环的指针(recv_ring),接收环包含了一些用于接收数据的缓冲区描述符。

接下来,函数从接收环中获取RDMA接收工作请求的描述符(wr)和缓冲区的描述符(sge)。wr->wr_id是一个用于标识接收工作请求的唯一值,通过将id与IPOIB_OP_CM和IPOIB_OP_RECV相或运算得到。

然后,函数使用rx->rx_ring[id].mapping数组中的缓冲区地址来初始化sge数组中的每个元素。这些缓冲区是之前分配给接收队列的。

最后,函数调用ib_post_recv函数将接收工作请求提交到接收队列上。如果返回值不为0,则表示提交失败,函数会释放相关资源(解映射DMA内存和释放缓冲区)。

总之,这段代码是一个在RDMA接收队列上提交接收工作请求的函数,用于接收来自RDMA协议的数据。

解读2

这段代码是Linux内核中的一个模块驱动函数,用于处理IP over InfiniBand (IPoIB) 的非Shared Receive Queue (SRQ) 情况下的Connected Mode (CM) 接收路径。函数`ipoib_cm_post_receive_nonsrq_rss`与之前讨论的`ipoib_cm_post_receive_srq_rss` 类似,但是针对的是非SRQ,也即每个Queue Pair (QP) 有自己独立的接收队列。这辟出来的通道允许接收侧的扩展(RSS),用来在多个CPU之间分配网络处理任务。下面来详细解析这段代码:
1. 函数接收三个参数:
   - *dev:指向 net_device 结构的指针,它与InfiniBand 网络设备相关联。
   - *rx:指向一个 ipoib_cm_rx 结构的指针,该结构包含了与特定CM接收队列相关的信息。
   - id:一个用于追踪特定接收缓冲区的标识符。
2. 通过 ipoib_priv(dev) 获取到一个指向IPoIB 私有结构(`ipoib_dev_priv`)的指针。
3. 计算对应接收环(`ipoib_recv_ring`)的地址,它是通过在IPoIB私有结构中的`recv_ring`加上`rx`提供的索引(`index`)得到的。
4. 设置局部指针变量指向Scatter-Gather元素(`ib_sge`)和接收工作请求(`ib_recv_wr`),这两者都从`recv_ring` 结构中获得。
5. 设置接收工作请求(Receive Work Request)的`wr_id`字段,将提供的 id 加上 IPOIB_OP_CM 和 IPOIB_OP_RECV 标志,表明这个操作与Connected Mode的接收动作有关。
6. 一个通过 IPOIB_CM_RX_SG 控制的循环用来设置 ib_sge 数组的地址(`addr`)。这些地址指向的是内存映射,硬件会使用它们在接收到包的时候放入其中。
7. 通过 ib_post_recv() 将接收工作请求提交到对应的Queue Pair (QP)。这个函数通常需要QP,指向工作请求的指针,以及用于存放下一个工作请求指针的指针(在这里是空指针NULL,因为不需要)。
8. 如果调用 ib_post_recv() 失败(返回非零值),通过 ipoib_warn() 记录错误信息。然后调用 ipoib_cm_dma_unmap_rx() 进行DMA解映射处理,并通过调用 dev_kfree_skb_any() 释放关联的套接字缓冲区,并将 skb 字段设置为 NULL。
9. 最后,这个函数返回来自 ib_post_recv() 的状态代码(`ret`),它指示成功(0)或错误码。
这个代码片段依然是源自于一个比较底层的Linux内核驱动程序,涉及到内核开发、InfiniBand架构、设备驱动程序和直接内存访问(DMA)。因此,它处理的网络设备操作和内存管理是由InfiniBand规范和驱动程序的架构决定的

解读3

这段代码是一个Linux内核模块驱动的一部分,特定于InfiniBand(IB)通信中的非SRQ(Subscription/Notification Queue)接收操作。下面是对代码的中文解释:

  1. 函数定义:

    • static int ipoib_cm_post_receive_nonsrq_rss(struct net_device *dev, struct ipoib_cm_rx *rx, int id):这是一个静态函数,返回类型为int。它接收三个参数:一个网络设备结构体指针dev,一个指向ipoib_cm_rx结构体的指针rx,和一个整数id
  2. 局部变量:

    • struct ipoib_dev_priv *priv = ipoib_priv(dev);:从网络设备结构体中获取私有数据结构体指针。
    • struct ipoib_recv_ring *recv_ring = priv->recv_ring + rx->index;:根据给定的索引从私有数据结构体的接收环中获取接收环结构体指针。
    • struct ib_sge *sge;:定义一个指向InfiniBand SGE(Scatter Gather Element)的指针。
    • struct ib_recv_wr *wr;:定义一个指向InfiniBand接收写请求的指针。
    • int i, ret;:定义整数变量i和ret。
  3. 设置写请求:

    • sge = recv_ring->cm.rx_sge;:将SGE指针设置为接收环中的SGE。
    • wr = &recv_ring->cm.rx_wr;:将写请求指针设置为接收环中的写请求。
    • wr->wr_id = id | IPOIB_OP_CM | IPOIB_OP_RECV;:设置写请求的ID,由id、IPOIB_OP_CM和IPOIB_OP_RECV按位或运算得到。
  4. 设置SGE:

    • 循环遍历私有数据结构体的碎片数量,并设置每个SGE的地址。
  5. 发送接收请求:

    • ret = ib_post_recv(rx->qp, wr, NULL);:使用InfiniBand API发送接收请求。如果返回值不为0,则进入错误处理部分。
  6. 错误处理:

    • 如果返回值ret不为0,则打印警告信息,取消DMA映射,并释放相关缓冲区。最后返回ret。
  7. 返回值:

    • 函数返回ret,即接收请求的返回值。如果成功,则返回0;否则返回非0值。

总体来说,这个函数的主要目的是通过InfiniBand接口发送非SRQ接收请求,并处理可能发生的错误情况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升开发效率的google插件

在如今的软件开发领域&#xff0c;Google Chrome浏览器的开发者插件扮演着至关重要的角色&#xff0c;为开发人员提供了丰富的工具和功能&#xff0c;从而提高了开发效率。下面介绍几款强大的 Google 插件&#xff0c;它们在不同方面为开发者提供了便利&#xff0c;并能显著提升…

力扣每日一题--2088. 统计农场中肥沃金字塔的数目

看到这道题有些人很容易放弃&#xff0c;其实这道题不是很难&#xff0c;主要是题目长&#xff0c;读的容易让人放弃&#xff0c;但是 只要抓住一些性质就可以解决该问题。 本题中的定义放到图像里其实就是个金字塔&#xff0c;下层的那部分比上一层的那部分&#xff0c;长度加…

51单片机HC-SR04超声波测距lcd1602显示(程序+ad硬件设计+文档说明)

本帖主控使用STC89C52单片机&#xff0c;超声波测距采用HC-SR04模块&#xff0c;包含ad硬件设计和文档。 测距原理 超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测出发射和接收回波的时间差t,然后求出距SCt/2,式中的C为超声波波速。由于超声…

【GitHub】如何删除GitHub仓库里的文件夹(区分 rm/git rm)

删除GitHub仓库里的一个文件夹 1、复制仓库地址2、在本地新建一个空文件夹3、在空文件夹内&#xff0c;右键选择Git Bash Here4、弹出GIT Bash框5、克隆远程仓库6、拉取远程仓库7、查看仓库里的文件8、选择想要删除的文件夹进行删除9、提交删除说明10、更新GitHub远程仓库 在gi…

微信小程序-----wxss模版样式

目录 前言 一、WXSS 1. 什么是 WXSS 2. WXSS 和 CSS 的关系 二、rpx 1. 什么是 rpx 尺寸单位 2. rpx 的实现原理 3. rpx 与 px 之间的单位换算 三、样式导入 1. 什么是样式导入 2. import 的语法格式 四、全局样式和局部样式 1. 全局样式 2. 局部样式 前言 上一期…

伪装目标检测模型论文阅读之:Zoom in and out

论文链接&#xff1a;https://arxiv.org/abs/2203.02688 代码;https://github.com/lartpang/zoomnet 1.摘要 最近提出的遮挡对象检测&#xff08;COD&#xff09;试图分割视觉上与其周围环境融合的对象&#xff0c;这在现实场景中是非常复杂和困难的。除了与它们的背景具有高…

漏洞复现-金和OA jc6/servlet/Upload接口任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【RT-DETR有效改进】ShapeIoU、InnerShapeIoU关注边界框本身的IoU(包含二次创新)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

【Linux】Linux系统编程——pwd命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 pwd&#xff08;Print Working Directory&#xff09;命令用于显示用户当前工作目录的完整路径。这是一个常用的命令&#xff0c;帮助用户确定他们目前所在的目录位置。 2.命令格式 基本的 pwd 命令…

基于Redis+Lua的分布式限流

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 前面我们了解了如何利用Nginx做网关层限流&#xf…

2024年AMC8历年真题练一练和答案详解(9),以及全真模拟题

“熟读唐诗三百首,不会作诗也会吟”&#xff0c;反复做真题、吃透真题、查漏补缺并举一反三是在各类考试、比赛中得高分的重要学习方法之一&#xff0c;参加AMC8竞赛也是如此。 六分成长继续为您分享AMC8历年真题&#xff0c;最后几天&#xff0c;通过高质量的真题来体会快速思…

爬虫-8-数据存储-mysql

#mysql占空间最小吧&#xff0c;数据存储没问题吧 (//∇//)

23111 网络编程 day2

思维导图 重打代码 #include<myhead.h> #define SER_IP "192.168.122.150" //服务器ip #define SER_PORT 8888 //服务器端口int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("…

压缩编码之JPEG变换编码不同压缩率的模拟的实现——数字图像处理

原理 离散余弦变换&#xff08;DCT&#xff09;和量化是图像压缩中的两个关键步骤&#xff0c;尤其是在JPEG压缩标准中。 离散余弦变换&#xff08;DCT&#xff09;&#xff1a;DCT的目的是将图像从空间域&#xff08;即像素表示&#xff09;转换到频率域。这种转换后&#x…

dp--62. 不同路径/medium 理解度A

62. 不同路径 1、题目2、题目分析3、复杂度最优解代码示例4、抽象与扩展 1、题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中…

利用Python的csv(CSV)库读取csv文件并取出某个单元格的内容的学习过程

csv库在python3中是自带的。 利用它可以方便的进行csv文件内容的读取。 注意&#xff1a;要以gbk的编码形式打开&#xff0c;因为WPS的csv文件默认是gbk编码&#xff0c;而不是utf-8。 01-读取表头并在打印每一行内容时一并输出表头 表头为第1行&#xff0c;现在要读取并打…

【GaussDB数据库】序

参考链接&#xff1a;国产数据库华为高斯数据库&#xff08;GaussDB&#xff09;功能与特点总结 GaussDB简介 官方网站&#xff1a;云数据库GaussDB GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#…

IOC之Spring统一资源加载策略

前言 在学 Java的时候&#xff0c;我们学习了一个标准类 java.net.URL&#xff0c;该类在 Java SE 中的定位为统一资源定位器&#xff08;Uniform Resource Locator&#xff09;&#xff0c;但是我们知道它的实现基本只限于网络形式发布的资源的查找和定位。然而&#xff0c;实…

layui实现地址下拉框模糊查询

layui实现地址下拉框模糊查询 HTML代码 注意&#xff1a;千万不要少 lay-search <div class"layui-col-md4"><label class"layui-form-label"><em>*</em>始发地&#xff1a;</label><div class"layui-input-bloc…

必示科技助力中国联通智网创新中心通过智能化运维(AIOps)通用能力成熟度3级评估

2023年12月15日&#xff0c;中国信息通信研究院隆重公布了智能化运维AIOps系列标准最新批次评估结果。 必示科技与中国联通智网创新中心合作的“智能IT故障监控定位分析能力建设项目”通过了中国信息通信研究院开展的《智能化运维能力成熟度系列标准 第1部分&#xff1a;通用能…