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

最近调用linux内核下RDMA的Verb API ib_post_send()出现了问题,因此从源码分析一下这个函数的调用过程。
我使用的内核版本为5.15.0-94
这是函数ib_post_send的头文件定义,这个函数的意义是向发送队列提交发送请求,他会调用qp对应设备的post_send操作
在这里插入图片描述
post_send是一个函数指针
在这里插入图片描述
post_send函数的具体实现在infiniband驱动程序里,这是驱动程序的路径
在这里插入图片描述
mlx5驱动作为内核模块载入内核:
在这里插入图片描述
模块载入过程中会进行相关变量、函数的绑定和初始化。其中post_send函数指针对应的函数为mlx5_ib_post_send_nodrain
在这里插入图片描述

而这个函数会调用mlx5_ib_post_send函数。
在这里插入图片描述
下面这个函数就是最后调用的函数。
在这里插入图片描述
这个函数的完整代码如下:

int mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr, bool drain)
{struct mlx5_wqe_ctrl_seg *ctrl = NULL;  /* compiler warning */struct mlx5_ib_dev *dev = to_mdev(ibqp->device);struct mlx5_core_dev *mdev = dev->mdev;struct mlx5_ib_qp *qp = to_mqp(ibqp);struct mlx5_wqe_xrc_seg *xrc;struct mlx5_bf *bf;void *cur_edge;int size;unsigned long flags;unsigned int idx;int err = 0;int num_sge;void *seg;int nreq;int i;u8 next_fence = 0;u8 fence;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_send(ibqp, wr, bad_wr);bf = &qp->bf;spin_lock_irqsave(&qp->sq.lock, flags);for (nreq = 0; wr; nreq++, wr = wr->next) {if (unlikely(wr->opcode >= ARRAY_SIZE(mlx5_ib_opcode))) {mlx5_ib_warn(dev, "\n");err = -EINVAL;*bad_wr = wr;goto out;}num_sge = wr->num_sge;if (unlikely(num_sge > qp->sq.max_gs)) {mlx5_ib_warn(dev, "\n");err = -EINVAL;*bad_wr = wr;goto out;}err = begin_wqe(qp, &seg, &ctrl, wr, &idx, &size, &cur_edge,nreq);if (err) {mlx5_ib_warn(dev, "\n");err = -ENOMEM;*bad_wr = wr;goto out;}if (wr->opcode == IB_WR_REG_MR ||wr->opcode == IB_WR_REG_MR_INTEGRITY) {fence = dev->umr_fence;next_fence = MLX5_FENCE_MODE_INITIATOR_SMALL;} else  {if (wr->send_flags & IB_SEND_FENCE) {if (qp->next_fence)fence = MLX5_FENCE_MODE_SMALL_AND_FENCE;elsefence = MLX5_FENCE_MODE_FENCE;} else {fence = qp->next_fence;}}switch (qp->type) {case IB_QPT_XRC_INI:xrc = seg;seg += sizeof(*xrc);size += sizeof(*xrc) / 16;fallthrough;case IB_QPT_RC:err = handle_qpt_rc(dev, qp, wr, &ctrl, &seg, &size,&cur_edge, &idx, nreq, fence,next_fence, &num_sge);if (unlikely(err)) {*bad_wr = wr;goto out;} else if (wr->opcode == IB_WR_REG_MR_INTEGRITY) {goto skip_psv;}break;case IB_QPT_UC:handle_qpt_uc(wr, &seg, &size);break;case IB_QPT_SMI:if (unlikely(!dev->port_caps[qp->port - 1].has_smi)) {mlx5_ib_warn(dev, "Send SMP MADs is not allowed\n");err = -EPERM;*bad_wr = wr;goto out;}fallthrough;case MLX5_IB_QPT_HW_GSI:handle_qpt_hw_gsi(qp, wr, &seg, &size, &cur_edge);break;case IB_QPT_UD:handle_qpt_ud(qp, wr, &seg, &size, &cur_edge);break;case MLX5_IB_QPT_REG_UMR:err = handle_qpt_reg_umr(dev, qp, wr, &ctrl, &seg,&size, &cur_edge, idx);if (unlikely(err))goto out;break;default:break;}if (wr->send_flags & IB_SEND_INLINE && num_sge) {err = set_data_inl_seg(qp, wr, &seg, &size, &cur_edge);if (unlikely(err)) {mlx5_ib_warn(dev, "\n");*bad_wr = wr;goto out;}} else {for (i = 0; i < num_sge; i++) {handle_post_send_edge(&qp->sq, &seg, size,&cur_edge);if (unlikely(!wr->sg_list[i].length))continue;set_data_ptr_seg((struct mlx5_wqe_data_seg *)seg,wr->sg_list + i);size += sizeof(struct mlx5_wqe_data_seg) / 16;seg += sizeof(struct mlx5_wqe_data_seg);}}qp->next_fence = next_fence;finish_wqe(qp, ctrl, seg, size, cur_edge, idx, wr->wr_id, nreq,fence, mlx5_ib_opcode[wr->opcode]);
skip_psv:if (0)dump_wqe(qp, idx, size);}out:if (likely(nreq)) {qp->sq.head += nreq;/* Make sure that descriptors are written before* updating doorbell record and ringing the doorbell*/wmb();qp->db.db[MLX5_SND_DBR] = cpu_to_be32(qp->sq.cur_post);/* Make sure doorbell record is visible to the HCA before* we hit doorbell.*/wmb();mlx5_write64((__be32 *)ctrl, bf->bfreg->map + bf->offset);/* Make sure doorbells don't leak out of SQ spinlock* and reach the HCA out of order.*/bf->offset ^= bf->buf_size;}spin_unlock_irqrestore(&qp->sq.lock, flags);return err;
}

此函数介绍如下:
1.函数参数:这个函数接收四个参数,分别是一个指向ib_qp结构的指针(代表一个InfiniBand队列对),一个指向ib_send_wr结构的指针(代表一个发送工作请求),一个指向ib_send_wr指针的指针(用于返回出错的工作请求),以及一个布尔值(表示是否为"drain"操作)。

2.函数首先进行错误检查,例如检查设备状态,检查工作请求的操作码,以及检查工作请求的SGE(Scatter/Gather Entry)数量。

3.函数的主要部分是一个循环,对每个工作请求进行处理。处理包括开始一个WQE(Work Queue Entry),设置控制段,处理不同类型的QP(例如RC、UC、UD等),设置数据段,以及完成WQE。
4.在处理完所有的工作请求后,函数会更新doorbell record,并通过写入doorbell来通知硬件开始处理WQE。

综上所述,当在内核中调用ib_post_send函数时,会触发infiniBand模块的回调函数mlx5_ib_post_send_nodrain,最后会调用到函数

int mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr, bool drain)

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

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

相关文章

[Vulnhub]靶场 Web Machine(N7)

kali:192.168.56.104 主机探测: arp-scan -l 靶机ip:192.168.56.104 端口扫描 nmap -p- 192.168.56.106 看一下web 目录扫描 gobuster dir -u http://192.168.56.106 -x html,txt,php,bak,zip --wordlist/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt exp…

2.29 二分

1.AcWing797. 差分 分析思路&#xff1a; 代码实现&#xff1a; //差分&#xff1a;前缀和的逆运算 #include<iostream>using namespace std; const int N 100010; int a[N],b[N]; int n,m;int main() {cin>>n>>m;for(int i1;i<n;i){cin>>a[i];…

深度学习-神经网络原理

文章目录 神经网络原理1.单层神经网络1.1 回归单层神经网络&#xff1a;线性回归1.2 二分类单层神经网络&#xff1a;sigmoid与阶跃函数 1.3 多分类单层神经网络&#xff1a;softmax回归 神经网络原理 人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&…

el-table实现转置表格

vue版本&#xff1a;vue2.6.10 elementui版本&#xff1a;2.15.14 实现效果&#xff1a;el-table实现行列互换 代码&#xff1a; <template><div class"app-container"><span>原始数据</span><el-table:data"datas"border>…

时下最火爆海外视频媒体推广,点燃全球市场!让您的产品走向世界

大舍传媒 如今&#xff0c;随着全球化的发展和数字技术的普及&#xff0c;视频媒体推广成为企业在全球市场中获取曝光和推动销售增长的重要方式。通过海外视频媒体推广&#xff0c;企业能够将产品打造成国际品牌&#xff0c;将其走向世界。 海外视频媒体推广迅速兴起&#xff0…

【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection

sqli-labs-master 21-37 Advanced-Injection 第一关到第二十关请见专栏 文章目录 sqli-labs-master 21-37 Advanced-Injection第二十一关-Cookie注入第二十二关-Cookie注入第二十三关-注释符过滤的报错注入第二十四关-二次注入第二十五关-过滤OR、AND双写绕过第二十五a关-过滤…

Redis为什么这么快?

首先我们需要知道影响Redis性能的因素有哪些&#xff1f; 官网原话说到&#xff0c;影响Redis性能的主要瓶颈并不是CPU而是内存和网络IO&#xff0c;而内存是可以从硬件角度优化的&#xff0c;所以优化的关键就是在网络IO 在Redis6/7中&#xff0c;非常受关注的一个新特性就是多…

【探索AI】十一 深度学习之第1周:深度学习概述与基础

深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架&#xff08;如TensorFlow或PyTorch&#xff09;进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代&#xff0c;当…

云时代【4】—— 资源隔离与控制技术

云时代【4】—— 资源隔离与控制技术 二、资源隔离与控制技术&#xff08;一&#xff09;NameSpace1. 基本介绍2. 相关 Linux 指令实战1&#xff1a;隔离进程实战2&#xff1a;隔离文件系统 &#xff08;二&#xff09;CGroups1. 基本介绍2. 相关 Linux 指令实战1&#xff1a;c…

xilinix 的硬件资源分布

从官方手册UG475中可以看出&#xff0c;下图中的V690T系列的i芯片&#xff0c;其具有的bank数量&#xff0c;已经上下半区的bufg对应的bank关系&#xff0c;实际在开发过程中&#xff0c;可能面临局部资源集中度过高&#xff0c;导致bufg的数量不够的情况&#xff0c;bufg的位置…

(转载)SpringCloud 微服务(三)-Seata解决分布式事务问题

ps:这个原文写的很好&#xff0c;怕后续这个地址失效&#xff0c;备份一个留着自己学习 转自&#xff1a;SpringCloud 微服务&#xff08;三&#xff09;-Seata解决分布式事务问题_seata 黑马 代码-CSDN博客 看完了黑马程序员的免费课程&#xff0c;感觉受益匪浅&#xff0c;…

为什么香港成为黄金交易的热门地?

香港作为一个国际金融中心&#xff0c;吸引了大量的黄金交易活动。这里汇聚了众多财富和机会&#xff0c;引发了人们对黄金交易和实体黄金的兴趣。那么&#xff0c;为什么那么多人爱去香港买黄金&#xff1f;让我们一起来探索黄金交易的魅力。 首先&#xff0c;香港以其优越的地…