• SPDK/NVMe存储技术分析之用户态ibv_post_send()源码分析(一)


    OFA定义了一组标准的Verbs,并提供了一个标准库libibvers。在用户态实现NVMe over RDMA的Host(i.e. Initiator)和Target, 少不了要跟OFA定义的Verbs打交道。但是,仅仅有libibverbs里的API是不够的,还需要对应的RDMA硬件的用户态驱动支持。本着“知其然更知其所以然”的精神,本文将以mlx5卡为例,分析用户态Verb API ibv_post_send()的实现原理。 分析用到的源码包有:

    • libibvers源代码: libibverbs-1.2.1.tar.gz
    • mlx5用户态驱动源代码: libmlx5-1.2.1.tar.gz
    • Linux内核源代码: linux-4.11.3.tar.xz

    在用户态的libibverbs中, ibv_post_send()的源代码片段如下:

    1. /* libibverbs-1.2.1/include/infiniband/verbs.h#1860 */
    2. 1860 /**
    3. 1861 * ibv_post_send - Post a list of work requests to a send queue.
    4. ....
    5. 1865 */
    6. 1866 static inline int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr,
    7. 1867 struct ibv_send_wr **bad_wr)
    8. 1868 {
    9. 1869 return qp->context->ops.post_send(qp, wr, bad_wr);
    10. 1870 }

    从L1869我们可以看出,post_send()是一个回调(callback)函数,跟RDMA硬件驱动密切相关。

    而在mlx5卡的用户态驱动libmlx5的REDME中,我们可以看到libmlx5是一个为libibverbs准备的plug-in模块,允许应用程序在用户空间直接访问Mellanox的硬件mlx5 HCA卡。 当应用程序开发人员使用libibverbs的时候,用户态驱动libmlx5被自动加载。但是,必须首先加载mlx5卡的内核驱动(mlx5_ib.ko)以发现和使用HCA设备。那么,为什么必须率先加载mlx5_ib.ko模块?这是一个值得深究的问题。 (难道libmlx5用户态驱动没有发现HCA卡的能力?)

    1. $ cat -n libmlx5-1.2.1/README
    2. 1 Introduction
    3. 2 ============
    4. 3
    5. 4 libmlx5 is a userspace driver for Mellanox ConnectX InfiniBand HCAs.
    6. 5 It is a plug-in module for libibverbs that allows programs to use
    7. 6 Mellanox hardware directly from userspace. See the libibverbs package
    8. 7 for more information.
    9. 8
    10. 9 Using libmlx5
    11. 10 ==============
    12. 11
    13. 12 libmlx5 will be loaded and used automatically by programs linked with
    14. 13 libibverbs. The mlx5_ib kernel module must be loaded for HCA devices
    15. 14 to be detected and used.

    要搞清楚ibv_post_send()是如何将工作请求send_wr发送到mlx5硬件上去的,我们需要搞清楚下面4个问题。

    • 问题1:回调函数post_send()与struct ibv_qp的关系
    • 问题2:回调函数post_send()的初始化
    • 问题3:回调函数post_send()在mlx5用户态驱动中的实现
    • 问题4:为什么使用
  • 相关阅读:
    图解系列--理解L3交换机的性能与功能
    驱动开发:内核特征码搜索函数封装
    Sentinel源码剖析之初始化
    Git 详细安装教程(详解 Git 安装过程的每一个步骤)
    Rust 学习笔记(持续更新中…)
    Vue3留言墙项目——主体部分静态、mock
    如何利用快解析实现个人私有云
    Linux·进程相关概念知识点
    微信小程序开发SSM项目教学管理系统
    分布式数据中心网络互联技术实现
  • 原文地址:https://blog.csdn.net/lingshengxiyou/article/details/126557821