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

news2024/12/22 11:23:21

一、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接收请求,并处理可能发生的错误情况。

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

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

相关文章

首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB × 杭州银行

日前&#xff0c;杭州银行新一代核心业务系统成功投产上线。 新核心系统是业内首个实际投产的云原生、分布式、全栈国产化的银行核心系统&#xff0c;是金融科技领域突破关键核心技术应用的重大实践。 新核心系统自上线以来运行安全稳定&#xff0c;大幅提升了业务处理效率&am…

基于JavaWeb+BS架构+SpringBoot+Vue基于hive旅游数据的分析与应用系统的设计和实现

基于JavaWebBS架构SpringBootVue基于hive旅游数据的分析与应用系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 概 述 5 1.1 研究背景 5 1.2 研究意义 5 1.3 研究内容…

香港Web3:Web3的新热土

相关推荐点击查看TechubNews 随着区块链技术的快速发展&#xff0c;Web3的概念逐渐在全球范围内受到关注。作为亚洲的金融中心&#xff0c;香港在Web3领域也展现出了极大的热情和潜力。本文将探讨香港在Web3领域的发展现状、机遇与挑战。 一、香港Web3的发展现状 香港在Web3…

使用python执行系统命令的五种方式

在日常开发中&#xff0c;有时需要在Python脚本中执行系统命令&#xff0c;Python有五种方式来执行系统命令&#xff0c;推荐使用第五种。 python执行系统命令的五种方式 方法1: os.system 这是最简单的方法&#xff0c;适合简单的业务场景&#xff0c;输入为完整命令字符串…

用Python做一个2048小游戏

文章目录 逻辑设计绘图逻辑主循环 逻辑设计 2048的逻辑无非是操作 4 4 4\times4 44的方格&#xff0c;每个方格中有一个数&#xff0c;这些数可以移动&#xff0c;如果两个相同的数字在移动时相撞了&#xff0c;就可以彼此合并。 而这个 4 4 4\times4 44的方格&#xff0c;…

scratch考试“画图”相关考点一网打尽

最近2023年12月17日举行的第15届蓝桥STEMA测评Scratch编程初/中级组编程第3题—六花阵图 在讲解这个题目&#xff0c;可以延申scratch所有的基础图形&#xff0c;学会这篇&#xff0c;碰到关于“图形”类题目基本上都可以搞定 六花阵图 编程实现&#xff1a; 六花阵图。 注…

C#,入门教程(15)——类(class)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(14)——字符串与其他数据类型的转换https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚&#xff0c;凡物必类。 类的使用&#xff0c;须遵循几个简单的原则&#xff1a; &#xff08;1&#xff09;能类则类&a…

selenium不自动关闭chrome,selenium hello world

selenium不自动关闭chrome 用visual studio的话&#xff0c;右键&#xff0c;在终端运行。 from selenium import webdriveroptions webdriver.ChromeOptions() options.add_experimental_option("detach", True) driver webdriver.Chrome(optionsoptions) url …

世微大功率 内置2.5A宽电压降压恒流 LED电源驱动车灯IC AP5193

AP5193是一款PWM工作模式,高效率、外围简单、 内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光 脚有效电压范围0.55-2.6V. AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c…

【Python】编程练习的解密与实战(三)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1fa90;1. 初识Python &a…

机器人制作开源方案 | 六足灾后探测机器人

作者&#xff1a;毕钟诚 施钥 范江龙 张莉曼 陈金凤 单位&#xff1a;中国石油大学&#xff08;北京&#xff09; 指导老师&#xff1a;许亚岚 孙琳 世纪全球自然灾害频发&#xff0c;灾后探测重建工作十分重要&#xff0c;极端恶劣的现场探测环境&#xff0c;频发的余震甚至…

Unity获取系统语言

大家好&#xff0c;我是阿赵。   在使用Unity引擎做多语言的游戏时&#xff0c;很有可能需要根据用户的手机或者电脑的当前语言来设置游戏的默认语言。   Unity的API里面默认就有可以获取系统语言的方法&#xff1a; Application.systemLanguageUnity的API例子&#xff1a…

Redis 为什么要分16个库

目录 一. 前言 二. 16 个数据库的由来 三. 正解 Redis 数据库概念 四. 集群环境下的 Redis 实例 五. 总结 一. 前言 在实际的项目中&#xff0c;Redis 常被用作缓存、分布式锁、消息队列等的解决方案。但是在搭建好Redis 服务后&#xff0c;Redis 默认创建了16个数据库&am…

基于知识图谱的健康知识问答系统

基于知识图谱的健康知识问答系统 引言数据集与技术选型数据集技术选型 系统功能与实现数据导入与图数据库构建问答任务设计与实现1. 实体提取2. 用户意图识别 前端聊天界面与问答系统 结语 引言 随着互联网的发展&#xff0c;人们对健康知识的需求逐渐增加。为了更方便地获取健…

Windows安全基础:认证基础知识

目录 Windows凭据 Windows访问控制模型 访问令牌&#xff1a; 安全标识符&#xff08;SID&#xff09;&#xff1a; 安全描述符&#xff1a; 令牌安全防御 1、禁止域管理员异机登录 2、开启“审核进程创建”策略 Windows凭据 SSPI&#xff08;Security Support Provide…

【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据

一、前言 目的&#xff1a;借助虚拟串口软件&#xff08;VSPD&#xff09;模拟硬件串口发送数据&#xff0c;使用PHP语言实现接收硬件发送的数据。 我这里的需求是连接天平&#xff0c;把天平的称量数据实时的传送到PHP使用。 使用工具&#xff1a;vspd串口调试工具 使用语…

第十三章Filter

第十三章Filter 1.什么是Filter过滤器2.Filter过滤器的基本使用示例3.完整的用户登录和权限检查4.Filter的生命周期5.FilterConfig类6.FilterChain多个过滤器执行的细节7.Filter的拦截路径 1.什么是Filter过滤器 2.Filter过滤器的基本使用示例 现在下面三个都是可以访问的&…

PPT插件-大珩助手-《提取选中的幻灯片》-选中新建

选中新建 提取选中的幻灯片到新的幻灯文稿中。PDF编辑器可以提取指定的页面到新的PDF文档中&#xff0c;PPT没有这个功能&#xff0c;因此开发。 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持Wps Wo…

Docker介绍安装及使用

目录 引言一、什么是Docker?二、Docker的优势三、Docker的架构四、Docker的安装五、Docker的基本使用六、Docker与传统虚拟化的比较七、Docker的应用场景八、总结 引言 在现代的软件开发和部署中&#xff0c;容器化技术已经成为了一种趋势。Docker作为容器化技术的领先者&…

im6ull学习总结(三-五)freetype显示正行字

知识补充 笛卡尔坐标系 这里笛卡尔坐标系就是初高中学的直角坐标系的第一象限 lcd坐标系则不同 这两个坐标系如何转换 观察两个坐标系 点&#xff08;x,y&#xff09;的x坐标在两个坐标系中相同&#xff0c;纵坐标&#xff08;y&#xff09;存在着yV-yV V是整个屏幕的行数的像…