DPDK驱动加载

目录

整体加载思路

配置步骤

全局变量配置

调用流程编写

加载VFIO模块

删除VFIO模块

加载KNI模块

卸载KNI模块

创建大页内存

创建大页内存文件系统

删除遗留的大页内存

卸载大页文件系统

调用dpdk-devbind.py脚本来绑定PCI设备igb_uio驱动

加载igb_uio.ko驱动.

卸载 igb_uio.ko 驱动


整体加载思路

1、加载IGB_UIO驱动;

2、加载VFIO模块;

3、配置大页内存;

4、set_numa_pages;

5、给PCIE网卡设备号加载IGB_UIO驱动;

6、加载载KNI模块,用于跑DPDK流的同时,并行跑标准内核协议.

配置步骤

全局变量配置

#配置DPDK安装路径
export RTE_SDK=$PWD

#定义PCIE网络端口设备号
export PCI_DEVICE0=0000:b3:00.0
export PCI_DEVICE1=0000:b3:00.1

#配置大页内存个数,结合当前大页内存个数来自定义
export Pages=20

#DPDK目标环境目录
export RTE_TARGET=x86_64-native-linux-gcc
echo "--------------------------------------------------------------------------                                                                          ----"
echo " RTE_SDK exported as $RTE_SDK"
echo "--------------------------------------------------------------------------                                                                          ----"

#获取大页内存大小
HUGEPGSZ=`cat /proc/meminfo  | grep Hugepagesize | cut -d : -f 2 | tr -d ' '`

调用流程编写

#加载IGB_UIO驱动
echo "LOAD IGB_UIO"
load_igb_uio

#加载VFIO模块
echo "LOAD VFIO"
load_vfio_module

#配置大页内存
echo "SET HUGE PAGES"
set_numa_pages

#给PCIE网卡设备号加载IGB_UIO
echo "BIND DEVICE -> $PCI_DEVICE0 and $PCI_DEVICE1"
echo "BIND DEVICE -> $PCI_DEVICE1 and $PCI_DEVICE1"
bind_devices_to_igb_uio

#加载载KNI模块,用于跑DPDK流的同时,并行跑标准内核协议
echo "LOAD KNI"
load_kni_module

加载VFIO模块

load_vfio_module()
{
        remove_vfio_module

        VFIO_PATH="kernel/drivers/vfio/pci/vfio-pci.ko"

        echo "Loading VFIO module"
        /sbin/lsmod | grep -s vfio_pci > /dev/null
        if [ $? -ne 0 ] ; then
                if [ -f /lib/modules/$(uname -r)/$VFIO_PATH ] ; then
                        sudo /sbin/modprobe vfio-pci
                fi
        fi

        # make sure regular users can read /dev/vfio
        echo "chmod /dev/vfio"
        sudo chmod a+x /dev/vfio
        if [ $? -ne 0 ] ; then
                echo "FAIL"
                quit
        fi
        echo "OK"

        # check if /dev/vfio/vfio exists - that way we
        # know we either loaded the module, or it was
        # compiled into the kernel
        if [ ! -e /dev/vfio/vfio ] ; then
                echo "## ERROR: VFIO not found!"
        fi
}

删除VFIO模块

remove_vfio_module()
{
        echo "Unloading any existing VFIO module"
        /sbin/lsmod | grep -s vfio > /dev/null
        if [ $? -eq 0 ] ; then
                sudo /sbin/rmmod vfio-pci
                sudo /sbin/rmmod vfio_iommu_type1
                sudo /sbin/rmmod vfio
        fi
}

加载KNI模块

load_kni_module()
{
    # Check that the KNI module is already built.
        if [ ! -f $RTE_SDK/$RTE_TARGET/kmod/rte_kni.ko ];then
                echo "## ERROR: Target does not have the DPDK KNI Module."
                echo "       To fix, please try to rebuild target."
                return
        fi

    # Unload existing version if present.
        remove_kni_module

    # Now try load the KNI module.
        echo "Loading DPDK KNI module"
        sudo /sbin/insmod $RTE_SDK/$RTE_TARGET/kmod/rte_kni.ko
        if [ $? -ne 0 ] ; then
                echo "## ERROR: Could not load kmod/rte_kni.ko."
                quit
        fi
}

卸载KNI模块

remove_kni_module()
{
        echo "Unloading any existing DPDK KNI module"
        /sbin/lsmod | grep -s rte_kni > /dev/null
        if [ $? -eq 0 ] ; then
                sudo /sbin/rmmod rte_kni
        fi
}

创建大页内存

# Creates hugepages on specific NUMA nodes.
set_numa_pages()
{
        clear_huge_pages

        #echo ""
        #echo "  Input the number of ${HUGEPGSZ} hugepages for each node"
        #echo "  Example: to have 128MB of hugepages available per node in a 2MB                                                                           huge page system,"
        #echo "  enter '64' to reserve 64 * 2MB pages on each node"

        #echo > .echo_tmp
        for d in /sys/kernel/mm ; do
                node=$(basename $d)
        #        echo -n "Number of pages for $node: $Pages"
                echo "Number of pages for $node: $Pages"
        #        read Pages
                echo "echo $Pages > $d/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" >> .echo_tmp
        done
        echo "Reserving hugepages"
        sudo sh .echo_tmp
        rm -f .echo_tmp

        create_mnt_huge
}

创建大页内存文件系统

# Creates hugepage filesystem.
create_mnt_huge()
{
        echo "Creating /mnt/huge and mounting as hugetlbfs"
        sudo mkdir -p /mnt/huge

        grep -s '/mnt/huge' /proc/mounts > /dev/null
        if [ $? -ne 0 ] ; then
                sudo mount -t hugetlbfs nodev /mnt/huge
        fi
}

删除遗留的大页内存

# Removes all reserved hugepages.
clear_huge_pages()
{
        echo > .echo_tmp
        for d in /sys/kernel/mm ; do
        echo "echo 0 > $d/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" >> .echo_tmp
        done
        echo "Removing currently reserved hugepages"
        sudo sh .echo_tmp
        rm -f .echo_tmp

        remove_mnt_huge
}

卸载大页文件系统

remove_mnt_huge()
{
        echo "Unmounting /mnt/huge and removing directory"
        grep -s '/mnt/huge' /proc/mounts > /dev/null
        if [ $? -eq 0 ] ; then
                sudo umount /mnt/huge
        fi

        if [ -d /mnt/huge ] ; then
                sudo rm -R /mnt/huge
        fi
}

调用dpdk-devbind.py脚本来绑定PCI设备igb_uio驱动

bind_devices_to_igb_uio()
{
        if [ -d /sys/module/igb_uio ]; then
                #${RTE_SDK}/usertools/dpdk-devbind.py --status
                #echo ""
                #echo -n "Enter PCI address of device to bind to IGB UIO driver:                                                                           "
                #read PCI_DEVICE
                sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b igb_uio $PCI_DEVICE0 && echo "$PCI_DEVICE0 Bind OK"
                sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b igb_uio $PCI_DEVICE1 && echo "$PCI_DEVICE1 Bind OK"
        else
                echo "# Please load the 'igb_uio' kernel module before querying                                                                           or "
                echo "# adjusting device bindings"
        fi
}

加载igb_uio.ko驱动.

load_igb_uio()
{
        #检查igb_uio驱动是否存在,不存在则退出,输出错误日志
        if [ ! -f $RTE_SDK/$RTE_TARGET/kmod/igb_uio.ko ];then
                echo "## ERROR: Target does not have the DPDK UIO Kernel Module.                                                                          "
                echo "       To fix, please try to rebuild target."
                return
        fi

        #在加载新的igb_uio前,先卸载旧的igb_uio驱动
        unload_igb_uio

        #查找UIO驱动是否存在,
        /sbin/lsmod | grep -s uio > /dev/null
        if [ $? -ne 0 ] ; then
                #输出UIO驱动信息
                modinfo uio 1>/dev/null 2>/dev/null
                if [ $? -eq 0 ]; then
                        #加载UIO模块
                        echo "Loading uio module"
                        sudo /sbin/modprobe uio
                fi
        fi

        # UIO may be compiled into kernel, so it may not be an error if it can't
        # be loaded.
        
        #加载载igb_uio驱动
        echo "Loading DPDK UIO module"
        sudo /sbin/insmod $RTE_SDK/$RTE_TARGET/kmod/igb_uio.ko
        if [ $? -ne 0 ] ; then
                echo "## ERROR: Could not load kmod/igb_uio.ko."
                quit
        fi
}

卸载 igb_uio.ko 驱动

unload_igb_uio() 
{
        echo "Unloading any existing DPDK UIO module"
        /sbin/lsmod | grep -s igb_uio > /dev/null
        if [ $? -eq 0 ] ; then
                sudo /sbin/rmmod igb_uio 1>/dev/null 2>/dev/null
        fi
}

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

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

相关文章

基于springboot + vue 学生网上请假系统

qq(2829419543)获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:springboot 前端:采用vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件&#xf…

GeoServer本地部署与远程访问Web管理页面——“cpolar内网穿透”

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除、插入…

(C语言)求出1,2,5三个数不同个数组合为100的组合个数

#include<stdio.h> int main() {int count;for(int i 0;i < 100;i )for(int j 0;j < 50;j )for(int k 0;k < 20;k ){if(i j*2 k*5 100){count;printf("100可以拆分为%d个1元&#xff0c;%d个2元&#xff0c;%d个5元\n",i,j,k);} }printf("…

正则表达式与SQL数据库教程

使用正则表达式通过用例查询 Postgres 数据库&#xff1a; 正则表达式&#xff08;又名 Regex&#xff09; 正则表达式是一个强大的工具&#xff0c;广泛用于模式匹配和文本操作。 几乎所有编程语言都支持它们&#xff0c;并且经常用于文本提取、搜索和匹配文本等用例。 正则…

【刷题】二分查找

二分查找 69. x 的平方根 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x **…

zipfile --- 使用ZIP存档

目录 ZipFile 对象 Path 对象 PyZipFile 对象 ZipInfo 对象 命令行接口 命令行选项 解压缩的障碍 由于文件本身 文件系统限制 资源限制 中断 提取的默认行为 源代码: Lib/zipfile/ ZIP 文件格式是一个常用的归档与压缩标准。 这个模块提供了创建、读取、写入、添加…

数据接口测试工具 Postman 介绍!

此文介绍好用的数据接口测试工具 Postman&#xff0c;能帮助您方便、快速、统一地管理项目中使用以及测试的数据接口。 1. Postman 简介 Postman 一款非常流行的 API 调试工具。其实&#xff0c;开发人员用的更多。因为测试人员做接口测试会有更多选择&#xff0c;例如 Jmeter…

探索人工智能领域——每日20个名词详解【day6】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

HCIP——交换综合实验

一、实验拓扑图 二、实验需求 1、PC1和PC3所在接口为access&#xff0c;属于vlan2&#xff1b;PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff1b;但PC4可以访问PC5&#xff0c;不能访问PC6 2、PC5不能访问PC6 3、PC1/3与PC2/4/5/6/不在同一网段 4、所有PC通…

CleanMyMac X2024破解注册激活码

CleanMyMac X for Mac中文2024版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 cleanmymac x个人认为X代表界面上的最大升级&#xff0c;功能方面有更多增加&#xff0c;与最新macOS系统更加兼容&#xff0c;流畅地与系统性…

Educational Codeforces Round 159 (Rated for Div. 2) 题解 A-C

目录 A - Binary ImbalanceB - Getting PointsC - Insert and Equalize A - Binary Imbalance 原题链接 题目描述 给你一个只包含字符 0或 1的字符串 s s s。在每次操作中&#xff0c;你可以从任意两个字符间插入一个字符&#xff1a;如果两个相邻的字符相等&#xff0c;那么…

选择排序、插入排序、希尔排序

1.选择排序 算法描述 将数组分为两个子集&#xff0c;排序的和未排序的&#xff0c;每一轮从未排序的子集中选出最小的元素&#xff0c;放入排序子集 重复以上步骤&#xff0c;直到整个数组有序 选择排序呢&#xff0c;就是首先在循环中&#xff0c;找到数组中最小的元素。在…

Docker 安装部署 Sentinel Dashboard

1、下载 jar 包 官方 jar 包下载地址&#xff1a;https://github.com/alibaba/Sentinel/releases 或者点击 链接 直接跳转到下载页 进入链接下载你需要的版本 下载完毕&#xff08;我这里统一放在一个sentinel目录内&#xff09; 2、编写 Dockerfile 文件&#xff08;这里我不…

详解—[C++数据结构]—红黑树

目录 一、红黑树的概念 ​编辑二、红黑树的性质 三、红黑树节点的定义 四、红黑树结构 五、红黑树的插入操作 5.1. 按照二叉搜索的树规则插入新节点 5.2、检测新节点插入后&#xff0c;红黑树的性质是否造到破坏 情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&…

一键式紧急报警柱系统

随着科技的不断发展&#xff0c;一键式紧急报警柱在我们的生活和工作中扮演着越来越重要的角色。在这篇文章中&#xff0c;我们将一起探究与一键式紧急报警柱有关的知识。 一键式紧急报警柱是一种常见的安全防护设备&#xff0c;能够在紧急情况下快速发出警报&#xff0c;保护…

探索数据之美:优雅权重计算方法与Python实践

写在开头 在数据的世界里,我们常常需要通过各种方法为不同的数据点分配合理的权重。这是数据分析中至关重要的一环,它决定了模型的准确性和结果的可信度。本文将引导您探索数据分析中常用的权重计算方法,并通过清晰的Python代码实现,让您轻松驾驭权重的奥秘。 1.常见分类…

XUbuntu22.04之安装OBS30.0强大录屏工具(一百九十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

​LeetCode解法汇总1038. 从二叉搜索树到更大和树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给定一个二…

【算法】Boyer-Moore 算法

目录 1.概述1.1.Boyer-Moore 算法介绍1.2.坏字符规则表1.3.好后缀规则表1.4.总结 2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法&#xff1a; 【算法】Brute-Force 算法 【算法】KMP 算法 【算法】Rabin-Karp …

数据在内存中的存储(含面试题)

数据在内存中的存储 1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 为什么有大小端?2.3 练习2.3.1 练习12.3.2 练习22.3.3 练习3第一题第二题 2.3.4 练习42.3.5 练习5第一题第二题 2.3.6 练习6 1. 整数在内存中的存储 在讲解操作符的时候…