1. 简介

KMD是燧原硬件产品的Linux内核态驱动。本文档主要介绍KMD的安装和使用方法。

2. 前提

燧原KMD只支持64位系统,且必须在BIOS中打开如下设置(不同BIOS的描述可能有所不同)。

Enable 4G decoding in BIOS

3. KMD安装

驱动安装包有以下几个。

  • enflame-xxx.run

    GCU的基础驱动模块,需要首先安装,其它模块都依赖它。安装时会在目标机上即时编译生成enflame.ko、安装efsmi/ef-debugdump等基础工具。

  • enflame_peer_mem-xxx.run

    分布式上基于RDMA网卡的加速模块,依赖ib_core等第三方驱动模块。

  • enflame_virt-xxx.run

    GCU的虚拟化模块,GCU虚拟化场景下才需要。

驱动包的安装参数:

sudo ./enflame-xxx.run [--no-auto-load] [--mdev-host | --with-vgcu] [--with-dkms | --no-dkms]

  • --no-auto-load :开机不自动加载kmd。默认开机自动加载。

  • --mdev-host | --with-vgcu :以mdev_host(VM monitor)或vgcu模式。默认为asic模式。(在S60上不支持)

  • --virt-host [–vf-num N] :以SRIOV模式加载kmd。N用于指定VF的个数(1/2/4),默认为2。(只在S60上支持)

  • --with-dkms | --no-dkms :是否使用dkms加载。默认为不使用。

Attention

run包仅支持asic平台,不支持仿真平台。

Attention

在mdev_host模式下,需要再执行”sudo ./enflame_virt-xxx.run”,额外加载虚拟化驱动run安装包。虚拟化驱动以Cluster为单位空分设备,每个mdev设备节点只能使用1个cluster的资源,然后,使用Qemu透传给不同的虚拟机用户使用。其中T20支持4个mdev,I20支持2个mdev。

Attention

在vgcu模式下,T20只支持按空分方式划分,每个vgcu设备节点只能使用1个cluster的资源,用来透传给不同的docker使用。I20同时支持空分和时分两种vgcu模式,其中空分方案支持2个vgcu,时分方案支持4个vgcu,缺省情况为空分方案。

参考 修改KMD的模块参数,使用不同的模块参数来设置vgcu数量。

#空分切换为时分的命令如下,然后再安装run包。
echo 'options enflame "vgcu_num=4"' > /etc/modprobe.d/gcu_test.conf

#时分切换为空分的命令如下,然后再安装run包。
echo 'options enflame "vgcu_num=2"' > /etc/modprobe.d/gcu_test.conf

4. KMD模块签名

部分机器上Linux内核中使能了驱动模块签名,即SSL signature功能,编译出的ko不能直接加载,必须由用户签名后才能安装。

run包的--mode是隐藏参数,将编译和安装分开,中间由用户自己做模块签名。
1. sudo ./enflame*.run --mode build
2. 对生成的*.ko做签名,再拷回到同目录下
3. sudo ./enflame*.run --mode install

5. 修改KMD的模块参数

在安装使用KMD时,可能需要临时修改一些模块参数,比如reset_enable等,可按以下步骤操作。

#常规安装run包,非必须
sudo ./enflame.*.run --xxx

#卸载已安装的模块
sudo rmmod enflame_peermem

#卸载主模块
sudo rmmod enflame

#拷贝一份临时配置文件,如源文件不存,可忽略
cp -f /etc/modprobe.d/gcu.conf  ./gcu_test.conf

#关闭reset功能
echo 'options enflame "reset_enable=0"'     >> gcu_test.conf

#关闭ssm rfw功能
echo 'options enflame "enable_ssm_rt_fw=0"' >> gcu_test.conf

#关闭sip timeout功能
echo 'options enflame "enable_sip_timeout_interval_ms=0"' >> gcu_test.conf

#关闭ssm rfw功能和reset功能
echo 'options enflame "enable_ssm_rt_fw=0,reset_enable=0"' >> gcu_test.conf

#以指定配置文件的方式重新加载驱动
sudo modprobe enflame -C ./gcu_test.conf

#确认驱动加载成功
lsmod | grep enflame

#验证模块参数是否生效
cat /sys/module/enflame/parameters/reset_enable

#验证是否修改成功
cat /sys/module/enflame/parameters/enable_sip_timeout_interval_ms

以上是一次性修改,如果需要长期生效,可直接修改/etc/modprobe.d/gcu.conf。

6. 卸载kmd

  • 临时卸载

lsmod | grep enflame ; sudo rmmod enflame
  • 永久卸载

sudo ./enflame-xxx.run --uninstall

7. 整卡透传虚拟化

GCU设备的虚拟化整卡透传,只支持Qemu 2.6.0和Qemu 5.0.0这两个版本的Qemu虚拟机,其它版本的虚拟机整卡透传暂时没有验证过
Qemu的I440FX主板,以及Qemu-2.6.0的Q35主板,只支持FLR透传,不支持Hot Reset透传
只有S60系列加速卡支持FLR,T2x系列加速卡和i2x系列加速卡设备不支持FLR,只支持Hot Reset
使用Qemu透传T2x系列加速卡和i2x系列加速卡设备时,需要在build编译Qemu之前,分别对Qemu-2.6.0和Qemu-5.0.0的源码,打上支持hot reset的quirk patch,否则,在虚拟机中,不能透传T2x系列加速卡和i2x系列加速卡设备的hot reset操作

7.1. GCU Qemu quirk patch功能介绍

  • 对不支持FLR的T2x系列加速卡和i2x系列加速卡设备,提供hot reset透传支持

  • 对透传GCU设备提供可配置的Security寄存器访问控制

7.2. GCU Qemu quirk patch源文件

caps/qemu/qemu-2.6.0-quirks.patch      # Qemu-2.6.0的quirk patch源文件
caps/qemu/qemu-5.0.0-quirks.patch      # Qemu-5.0.0的quirk patch源文件
caps/qemu/qemu-build-sample.sh         # 编译和安装Qemu源码的参考Script脚本
caps/qemu/qirk-config-sample.conf      # 透传设备的寄存器Security安全访问控制的参考配置文件

7.3. Qemu的编译和安装

  • 编译和安装的sample脚本,caps/qemu/qemu-build-sample.sh,只在Ubuntu 1604系统上验证过

  • 在其他系统编译和安装Qemu工具,参考build sample脚本的步骤调试

  • 使用sample脚本编译和安装Qemu 2.6.0

./caps/qemu/qemu-build-sample.sh 2.6.0
  • 使用sample脚本编译和安装Qemu 5.0.0

./caps/qemu/qemu-build-sample.sh 5.0.0
  • 使用sample脚本的Qemu安装位置

/opt/qemu-2.6.0/
/opt/qemu-5.0.0/

7.4. 检查是否安装GCU Qemu Quirk Patch

在使用Qemu命令启动VM虚拟机,整卡透传GCU设备后,如果Qemu安装了GCU Qemu Quirk patch,命令行会打印如下的log信息:
################################################################
################# GCU Qemu Quirk Patch Applied #################
################################################################

7.5. Security寄存器访问控制配置文件

  • 访问控制配置文件是option选项,如果没有Security访问控制需求,可以不用添加配置文件

  • 配置文件的编写规则,参考sample配置文件,caps/qemu/qirk-config-sample.conf

  • 默认的sample配置文件,是把BAR0全部寄存器访问设置为ReadOnly只读,把BAR1全部寄存器设置为访问不受限制

  • 单个配置文件与单个GCU设备对应,配置文件名为GCU设备的domain:bus:dev.func.conf

  • 配置文件存放位置,/etc/qemu-quirks/enflame/domain:bus:dev.func.conf

7.6. GCU Qemu qurk patch log开关

  • 在Security寄存器访问控制配置文件中,把logging = 0修改为logging = 1,可以打开qemu quirk patch中的log开关

  • 打开log开关后,对透传设备执行Hot Reset操作,Qemu会打印“GCU Qemu Quirk Reset Passthrough …”信息,可以用这个log信息check判断patch的hot reset功能是否生效

7.7. S60系列加速卡透传的Reset操作

  • 使用Qemu整卡透传S60系列加速卡设备,不需要安装上述GCU Qemu Quirk Patch,就可以对GCU设备实现Reset透传操作

  • Qemu虚拟机对透传S60系列加速卡设备,只支持FLR Reset透传,不支持Hot Reset透传

7.8. S60系列加速卡透传/SRIOV VF透传/SRIOV使能时的限制

  • 流程上需要先退出VM,unbind from vfio,最后才能做rmmod host kmd

  • 在SRIOV模式下,PF不能透传到VM中,只有VF才可以透传到VM

  • 业务的运行的过程中,不允许删除VF

8. 常用调试功能

8.1. 查看当前KMD的版本

cat /sys/module/enflame/version

8.2. 查看当前KMD的模块参数

cat /sys/module/enflame/parameters/*

8.3. 查看所有GCU设备的PCI设备号

sudo update-pciids ; lspci -nD | grep -e 1ea0 -e 1e36

8.4. 查看GCU上各个firmware的版本

cat /sys/module/enflame/drivers/pci:enflame/0000:01:00.0/fw_informations
或
cat /sys/class/enflame/gcu0/device/fw_informations

8.5. 查看KMD日志

dmesg                         # 当前的kernel log
cat /var/log/kern.log         # 最近几天的kernel log
zcat /var/log/kern.log.*.gz   # 更久以前的kernel log

8.6. 防火墙相关

与ecc类似,防火墙也是一个与硬件绑定的功能,加载驱动时,会判断新FW和GCU上当前的防火墙状态,两者一致时才会根据防火墙状态加载对应的驱动,完成设备初始化。

  • 芯片支持范围

    仅i20支持防火墙功能。

  • 安全寄存器列表

安全寄存器指被防火墙保护的寄存器,其地址范围可通过下述命令查看。
cat /sys/kernel/debug/enflame/0/dump/dump_reg_group
  • 被防火墙拦截寄存器读写

位于安全寄存器地址空间的寄存器,读操作会得到0xFFFFFFFF的结果,写操作将被防火
墙忽略。

8.7. KMD standby相关

做错误定位时涉及到KMD、FIRMWARE、TOOLS,为了快速缩小问题范围,可以开启该功能以确定是否为驱动Bug.

  • 禁用/允许IOCTL

    禁用IOCTL后,除whitelist外任何工具或UMD调用KMD IOCTL的命令会失败返回

sudo echo 1 > /sys/class/enflame/gcu0/device/standby/disable_ioctl
sudo echo 0 > /sys/class/enflame/gcu0/device/standby/disable_ioctl
  • 添加/删除whitelist

    在禁用IOCTL后,允许在whitelist中的工具或UMD调用KMD IOCTL

sudo echo "add:efvs" > /sys/class/enflame/gcu0/device/standby/whitelist
sudo echo "delete:efvs" > /sys/class/enflame/gcu0/device/standby/whitelist
  • suspend/resume KMD中的线程(gcu_sched_func,gcu_poll_task_func)

    使用该接口会让KMD中的线程(gcu_sched_func,gcu_poll_task_func)进入睡眠状态

sudo echo 1 > /sys/class/enflame/gcu0/device/standby/suspend_thread
sudo echo 0 > /sys/class/enflame/gcu0/device/standby/suspend_thread

Attention

该接口不会停用gcu_ih_process_work_func线程。如果需要停用该线程,请在驱动加载时,添加参数irq_poll_interval=0

  • 使用举例

sudo echo "add:efvs" > /sys/class/enflame/gcu0/device/standby/whitelist
sudo echo 1 > /sys/class/enflame/gcu0/device/standby/disable_ioctl
sudo echo 1 > /sys/class/enflame/gcu0/device/standby/suspend_thread
bypass kmd and debug
sudo echo 0 > /sys/class/enflame/gcu0/device/standby/disable_ioctl
sudo echo 0 > /sys/class/enflame/gcu0/device/standby/suspend_thread
sudo echo "delete:efvs" > /sys/class/enflame/gcu0/device/standby/whitelist

8.8. power stock相关

某些情况下,用户希望手动干预KMD预设的power stock值,相关接口如下

  • sysfs接口

    使用sysfs可以在加载驱动后,动态管理power stock功能,在各种安装方式下都可以使用

    • enable_power_stock,查询/修改RPM开启状态,1 表示power stock功能开启,0 表示关闭

    sudo cat /sys/class/enflame/gcu0/device/power_stock/enable_power_stock
    sudo echo 1 > /sys/class/enflame/gcu0/device/power_stock/enable_power_stock
    

8.9. 运行时低功耗(RPM)相关

某些情况下,用户希望手动干预KMD预设的低功耗管理功能,相关接口如下

  • sysfs接口

    使用sysfs可以在加载驱动后,动态管理RPM功能,在各种安装方式下都可以使用

    • 查询/修改RPM开启状态,start 表示RPM功能开启,stop表示RPM关闭。在sriov业务场景中需要同时操作pf和vf设备的节点来进行开启和关闭。

    sudo cat /sys/class/enflame/gcu0/device/rpm/switch
    sudo echo "start" > /sys/class/enflame/gcu0/device/rpm/switch
    
    • 查询/修改设备参数,idle多久后会进入sleep状态,单位ms,默认值10000

    sudo cat /sys/class/enflame/gcu0/device/rpm/rpm_sleep_delay
    sudo echo 100000 > /sys/class/enflame/gcu0/device/rpm/rpm_sleep_delay
    
    • 查询设备是否在低功耗状态,active是正常工作状态,非active是低功耗状态

    sudo cat /sys/class/enflame/gcu0/device/rpm/status
    
    • 查询使用设备的进程数量,数量为0表示没有进程使用该设备

    sudo cat /sys/class/enflame/gcu0/device/rpm/usage_count
    
    • 查询/修改不进入usage_count计数的白名单

    sudo cat /sys/class/enflame/gcu0/device/rpm/whitelist
    sudo echo add:name0 > /sys/class/enflame/gcu0/device/rpm/whitelist
    sudo echo delete:name0 > /sys/class/enflame/gcu0/device/rpm/whitelist
    
    • 查询设备自加载驱动以来总共的active时间

    sudo cat /sys/class/enflame/gcu0/device/rpm/active_time
    
    • 查询设备自加载驱动以来总共的suspended时间

    sudo cat /sys/class/enflame/gcu0/device/rpm/suspended_time
    
    • 查询设备自加载驱动以来总共的suspend次数

    sudo cat /sys/class/enflame/gcu0/device/rpm/suspend_count
    
    • 查询设备自加载驱动以来总共的wake up次数

    sudo cat /sys/class/enflame/gcu0/device/rpm/wakeup_count
    
    • 查询最后一个使用该设备的进程结束后,距离现在多久,单位ms

    sudo cat /sys/class/enflame/gcu0/device/rpm/last_busy
    

9. GCU虚拟化用户向导

9.1. GCU各种虚拟化方法概要

虚拟化方法

VGDI

SR-IOV

MDEV

虚拟化层级

软件模拟/dev/vgcu文件节点

硬件生成独立的PCIe VF设备

基于Linux mdev框架,软件模拟mdev设备

组件

KMD

PCIe SR-IOV规范 + KMD + VFIO + 各FW

KMD + MDEV + VFIO + XMC

切分方式

软件空分

硬件空分

软件空分

资源隔离

硬件

软件

故障隔离

目标场景

宿主机或透传虚拟机后,将一张物理卡以纯驱动方式虚拟出多个设 备文件节点。同张物理卡生成的虚拟设备只能给不同的docker使用

宿主机驱动生成独立的PCIe VF设备,每个 每个VF可在宿主机或透传到虚拟机上使用

宿主机驱动生成虚拟设备mdev UUID号。其仅能透传 到虚拟机后形成PCIe设备,在虚拟机内使用。

虚设备支持 Docker

Yes

Yes

No

虚设备支持 透传虚拟机

No

Yes

Yes

比裸卡性能 损失

< 5%

单die1VF:< 5%/单die2VF:~10%

训练:~5%/推理:~15%

支持产品

i2x系列加速卡、T2x系列加速卡

S60系列加速卡

i2x系列加速卡、T2x系列加速卡

9.2. S60系列加速卡 SR-IOV支持

  • 实现基础

    基于标准的PCIe SR-IOV规范,通过XMC和 HW Context ID,S60系列加速卡支持将GCU片上硬件资源做硬件级拆分与隔离,可将一张物理GCU拆分为1/2/4个PCIe VF(Virtual Function),VF间的资源与故障是硬件隔离的。

当S60系列加速卡开启SR-IOV虚拟化功能并配置VF数量后,宿主机上每个GCU将生成一个PCIe PF和对应数量的PCIe VF设备。 对普通用户而言,PF/VF都是标准的PCIe设备,只是可用的计算、存储等资源只有真正物理卡的几分之一。 驱动probe后每个VF会生成/dev/gcuX计算设备节点,与普通物理卡生成的文件节点一样,KMD以上的软件可直接使用,不感知区别。

  • PF和VF功能

    PF设备只负责对GCU设备全局的管理,以及VF的创建、销毁等操作,它本身没有算力资源,故不对外提供任何业务功能,也不能透传到虚拟机。 每个VF则包含部分完全空分的资源,以及部分共享的资源。VF是用户可见、能直接用于计算业务的,也可透传到docker或虚拟机内使用。

  • 资源切分

    片上的计算、存储、传输、同步等各种硬件资源,根据业务使用与否,以及实例是否可拆份,划分为以下几种类型:

    类型

    归属

    描述

    IP

    PF-only

    只属于PF,不 属于任何VF

    业务不直接感知,全局一个 实例,一般做管理用

    PCIe、SSM、AASP、NoC

    VF-only

    只属于某个VF

    业务使用,有多个实例,且 足够给每个Function一份

    SIP、SDTE、L1、CBF、L3、SP HWQ、SP task core

    VF-shared

    多个VF共享

    业务需要使用,但全局只有 一份实例

    VMsys、MIH、HWSync、GSync、SP main core、ODTE、 CDTE、AP、CVA、VPU等

  • 双die 2VF切分示意图

    双die 2VF切分示意图
  • 双die 4VF切分示意图

    双die 4VF切分示意图
  • 注意:

    每个VF的L3实际大小为:(48G - 2G)/ VF_NUMS,其中2GB是预留给PF的。所以2VF的话,每个VF只有23G,4VF的话,每个VF只有11.5GB。

9.3. 各种reset

Reset Type

描述

命令

reset范围

触发场景

VF FLR

仅reset VF-only IP

efsmi -r

VF-only IP发生 故障或错误

宿主机或虚机上的VF

PF FLR

SoC上除PCIe、SSM外的所有IP都会被reset, 各FW会reload,L2/L3清0

efsmi -pf -r

VF-shared IP发生 故障或错误

宿主机上的PF,或VF FLR失败后升级

Hot Reset

整卡做Secondary Bus Reset,所有IP都会被reset 各FW会reload,L2/L3清0

efsmi -r hot

PF-only IP发生 故障或错误

宿主机上ASIC或PF FLR 失败后升级

  • VF透传到虚拟机内的reset

命令

描述

efsmi -r hot

VM内不支持VF上做hot reset,故VM KMD会返回不支持。

efsmi -r 或efsmi -r flr

VM KMD仅执行VF FLR,FLR失败就返回,不自动升级为hot,否则会影响其它VF。

VF-only IP RAS

此种RAS只报给VF。VM KMD仅执行VF FLR。VF FLR若失败就直接返回,不会升级到PF FLR或Hot,否则会影响其它VF。

非VF-only IP RAS

此种RAS只报给PF,不会报给VF。 PF会先将SP暂停,停止VF侧的业务,然后执行PF FLR或Hot Reset。 此场景下dmesg会有信息提示用户或运维人员介入,关闭虚拟机,将VF从vfio解绑,再删除VF。

9.4. VF管理

在宿主机上安装驱动后,可通过标准的Linux sriov_numvfs 等文件来做VF的创建、销毁、驱动绑定、透传虚拟机等。

为了简化用户配置管理,推荐直接使用集成在驱动run包中一起安装的 GcuSriovMgr 工具。注意,此工具需sudo或root权限。

root@sse-jq-114-138:/usr/local/bin# GcuSriovMgr --help
Version: 0.1
Usage: sudo ./GcuSriovMgr.sh <--slot pci_slot[,pci_slot2]> [--vf-num vf_number] [--check] [--bind] [--unbind] [--query]
 --slot   : pci_slot[,pci_slot2] is BDF number of the device you want to manage.
 --vf-num : create vf_number vfs, 0 means to destroy all vfs
 --check  : check sriov configuration on system
 --bind   : bind pcidev to vfio
 --unbind : unbind pcidev from vfio
 --query  : query pcidev info

Example1: ./GcuSriovMgr.sh --slot 01:00.0[,02:00.0] --vf-num 4, create 4 vfs for device 01:00.0 [and 02:00.0]
Example2: ./GcuSriovMgr.sh --slot 01:00.0 --vf-num 0, delete all vfs from device 01:00.0
Example3: ./GcuSriovMgr.sh --slot 01:00.0 --check, check sriov configuration on system
Example4: ./GcuSriovMgr.sh --slot 01:00.0 --bind, bind pcidev to vfio
Example5: ./GcuSriovMgr.sh --slot 01:00.0 --unbind, unbind pcidev from vfio
Example6: ./GcuSriovMgr.sh --slot 01:00.0 --query, show pcidev info

9.5. VF的典型应用

  • 直接在宿主机中使用VF

    1. 安装宿主机的驱动,参考命令:

      sudo ./enflame-xxx.run --virt-host --vf-num N
      

    其中N表示需要创建几个VF,有效值为1,2,4(根据实际产品定义)

    1. 宿主机上为每个VF生成一个设备文件节点/dev/gcux

    2. 在宿主机上安装必要的上层组件,启动业务进程

  • 把VF传给宿主机的docker使用

    1. 安装宿主机的驱动,参考命令:

      sudo ./enflame-xxx.run --virt-host --vf-num N
      

    其中N表示需要创建几个VF,有效值为1,2,4(根据实际产品定义)

    1. 宿主机上为每个VF生成一个设备文件节点/dev/gcux

    2. 启动docker,并把要使用的VF对应的/dev/gcux文件映射到docker内,以gcu0为例,参考命令:

      sudo docker run -it --name gcu0_test --device /dev/gcu0:/dev/gcu0 --device=/dev/gcuctl:/dev/gcuctl -v /home:/home -v /root/:/root/ --network host ubuntu:20.04
      sudo docker exec -it gcu0_test  /bin/bash
      

    4.在docker内安装必要的上层组件,启动业务进程

  • 把VF透传到KVM虚拟机中使用

    把VF透传到KVM虚拟机中使用

-步骤

  1. 安装宿主机的驱动,参考命令:

    sudo ./enflame-xxx.run --virt-host --vf-num N
    
    其中N表示需要创建几个VF,有效值为1,2,4(根据实际产品定义)
    
  2. 将GCU VF与vfio-pci绑定,参考命令:

    GcuSriovMgr [--slot xxx] --bind
    
    其中参数slot为可选,xxx表示VF的bdf。如果不指定slot,表示将所有
    的VF都绑定到vfio-pci
    
  3. 启动KVM虚拟机,并将目标VF透传到VM内,参考命令:

    qemu-system-x86_64 -M q35 -m 16G -smp 8 -enable-kvm -vga virtio -cpu host -drive file=ubuntu-2004_60G.qcow2,if=virtio -vnc :1 -net nic,model=virtio -net user,hostfwd=tcp::2222-:22 -device ioh3420,id=root_port1,bus=pcie.0 -device x3130-upstream,id=upstream1,bus=root_port1 -device xio3130-downstream,id=downstream1,bus=upstream1,chassis=9 -device vfio-pci,bus=downstream1,host=$vf_bdf
    
  1. 在虚拟机中加载驱动,参考命令:

    sudo ./enflame-xxx.run
    
  2. 在虚拟机上安装必要的上层组件,启动业务进程

  3. 在虚拟机跑完业务,关闭虚拟机

  4. 宿主机上将GCU VF重新绑定回KMD,参考命令:

    GcuSriovMgr [--slot xxx] --unbind
    

    其中参数slot为可选,xxx表示VF的bdf。如果不指定slot,表示将所有的VF都绑定回KMD

9.6. 限制

  • S60(PN:EFB-0088800-00)仅支持2VF模式。

  • S60(PN:EFB-0088000-00)支持ASIC、1VF、2VF、4VF模式。

10. FAQ

10.1. KMD编译失败

KMD编译失败,出现类似如下log:

../../../../_images/kmd_build_fail_as_header_miss.png

图 10.1.1 没有kernel开发头文件导致KMD编译失败

此时,请先在host机器上安装对应的kernel header,再次编译KMD即可。

sudo apt-get install linux-headers-`uname -r`

10.2. 模块正在使用而无法卸载

  • 查找正在使用gcu驱动的内核模块

lsmod | grep enflame

下图表示enflame模块正在被enflame_test模块使用,需先 rmmod enflame_test

../../../../_images/kmd_in_use.png

图 10.2.1 正在使用enflame的其它模块

  • 查找正在使用gcu驱动的进程

X=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || X+=("-e$a"); done ; lsof "${X[@]}" -f -- /dev/gcu*
ps -aux | grep gcu
kill -9 <进程ID>

Attention

如果出现进程杀不掉,则可能是docker使用方式不对

10.3. enflame_peer_mem驱动加载失败

enflame_peer_mem驱动加载失败,kernel.log显示如下:

../../../../_images/kmd_peermem_load_fail_as_openibd_excetpion.png

图 10.3.1 openibd服务异常导致enflame_peer_mem驱动加载失败

原因:openibd服务异常导致的问题。

检查openibd状态
/etc/init.d/openibd status
重启openibd服务
/etc/init.d/openibd restart

openibd服务重启后,再次加载enflame_peer_mem驱动即可。

10.4. KMD device id与PCI bdf对应关系

# 以0000:01:00.0为例
cat /sys/bus/pci/devices/0000\:01\:00.0/device_id

确定对应关系的方法如下图:

../../../../_images/kmd_find_device_id_by_bdf.png

注意:device_id是kmd的逻辑设备号,每次加载kmd后可能与上次不同。

10.5. KMD ioctl版本号使用说明

  1. 获取ioctl版本号的方法:

通过kmd提供的sys 文件节点:’/sys/module/enflame/drivers/pci:enflame/gcu_ioctl_version’

Attention

获取kmd版本号:’cat /sys/module/enflame/version’

2. KMD的ioctl版本号格式为:major.minor.patch 含义分别为:

major: 主版本号,当兼容性发生变化时,会修改此段
minor: 次版本号,当有额外的ioctl命令增加时,会修改此段
patch: 修订版本号,当kmd修复bug时,会修改此段

10.6. 设备整卡透传到Qemu虚拟机后,执行hot reset失败

把T2x系列加速卡和i2x系列加速卡透传到Qemu虚拟机后,在虚拟机中出现执行hot reset失败的情况 原因:使用的Qemu版本不正确,不是Qemu-2.6.0或者Qemu-5.0.0,且没有在编译Qemu之前,对Qemu源码添加支持hot reset的quirk patch,参考整卡透传虚拟化中的步骤,重新编译安装Qemu工具

11. 相关参考

11.1. reset种类

  • cold reset: reset from PWROK PAD

cat /sys/bus/pci/devices/xxx/power/control
  • warm reset: Button reset from BRST# PAD or PCIE PERST# from PCIE slot

echo 1 > /sys/bus/pci/devices/xxx/remove
sleep 1
echo 1 > /sys/bus/pci/devices/xxx/rescan

Attention

rescan会在相应的卡上重新加载kmd驱动

  • PCIe hot/link-down reset:与warm reset类似,会复位除PCIe controller外的其它所有IP。而PCIe controller会被内部复位。

#直接操作 bridge port
dev=0000:01:00.0
port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$dev")))
[ -e "/sys/bus/pci/devices/$port" ] && {
      bc=$(setpci -s $port BRIDGE_CONTROL)
      setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $((0x$bc | 0x40)))
      sleep 0.01
      setpci -s $port BRIDGE_CONTROL=$bc
      sleep 0.5
}
  • PCIe FLR:向PCIe cfg space的FLR位写1,PCIe controller将触发SSM MCU中断,SSM来执行FLR reset sequence。

echo 1 > /sys/bus/pci/devices/xxx/reset

Attention

T2x系列加速卡不支持FLR,向reset写1时,会fallback至hot reset。i2x系列加速卡 FLR是不带NOC的FLR。

  • BLR:Driver直接给SSM发带参数的命令,SSM来执行指定单个block的reset,包括 “All IPs”/Cluster/VG/HCVG/VDEC。

11.2. Reset GCU的几种方法

    1. Docker内,使用如下命令重新加载指定的驱动。

echo 1 > /sys/bus/pci/rescan
    1. Docker内。

efsmi -F -r -i [ID]
    1. Docker或Host内,hot reset某个设备,如gcu0(0000:01:00.0)。

echo 1 > /sys/class/enflame/gcu0/device/gcu_reload
或者
echo 1 > /sys/bus/pci/devices/0000:01:00.0/gcu_reload
gcu_whitelist_str=00:01.0

11.3. 关闭Gcu Reset

Docker或Host内:

# 查看初始值,默认为全 f。以便重写后恢复默认值
cat /sys/bus/pci/drivers/enflame/reset_enable
# 关闭Gcu Reset
echo 0 > /sys/bus/pci/drivers/enflame/reset_enable