用户空间加速器开发套件(UADK)压缩
UADK 是通用用户空间加速器框架,通过共享虚拟寻址(SVA) 为密码和压缩算法硬件加速提供统一编程接口。
UADK 包含统一/面向用户空间访问的加速器框架(UACCE), 使不同厂商支持 SVA 的硬件加速器能够接入 UADK。
目前海思鲲鹏硬件加速器已注册到 UACCE。 用户可通过 UADK 让硬件加速器而非 CPU 执行密码和压缩算法, 释放 CPU 算力并提高计算性能。
https://github.com/Linaro/uadk/tree/master/docs
UADK 框架
UADK 由 UACCE、厂商驱动和算法层组成。 要求加速器支持 SVA,操作系统支持 IOMMU 和 SVA。 不同厂商的加速器通过各自内核驱动向 UACCE 注册为不同字符设备, 用户通过用户态操作这些设备访问硬件。
+----------------------------------+
| 应用 |
+----+------------------------+----+
| |
| |
+-------+--------+ +-------+-------+
| 调度器 | | 算法库 |
+-------+--------+ +-------+-------+
| |
| |
| |
| +--------+------+
| | 厂商驱动 |
| +-+-------------+
| |
| |
+--+------------------+--+
| libwd |
用户态 +----+-------------+-----+
--------------------------------------------------
内核态 +--+-----+ +------+
| uacce | | smmu |
+---+----+ +------+
|
+---+------------------+
| 厂商内核驱动 |
+----------------------+
--------------------------------------------------
+----------------------+
| 硬件加速器 |
+----------------------+
安装 UADK
构建 UADK
git clone https://github.com/Linaro/uadk.git
cd uadk
mkdir build
./autogen.sh
./configure --prefix=$PWD/build
make
make install
未指定 --prefix 时,默认安装到 /usr/local/lib。 如果出现“cannot find -lnuma”,请安装 libnuma-dev。
运行 pkg-config libwd 确认环境正确
export PKG_CONFIG_PATH=$PWD/build/lib/pkgconfig
pkg-config libwd --cflags --libs -I/usr/local/include -L/usr/local/lib -lwd
按需导出 PKG_CONFIG_PATH。 安装到 /usr/local/lib 时不需要。
UADK 主机内核要求
应确保 Linux 内核支持 UACCE。 至少使用 v5.9,并启用共享虚拟寻址(SVA)。
内核配置
UACCE 可以编译为模块或内置。
以下是在海思鲲鹏平台启用 UACCE 和硬件加速器的示例。
CONFIG_IOMMU_SVA_LIB=y
CONFIG_ARM_SMMU=y
CONFIG_ARM_SMMU_V3=y
CONFIG_ARM_SMMU_V3_SVA=y
CONFIG_PCI_PASID=y
CONFIG_UACCE=y
CONFIG_CRYPTO_DEV_HISI_QM=y
CONFIG_CRYPTO_DEV_HISI_ZIP=y
确保启用以上全部内核配置。
加速器设备节点权限
硬件加速器(例如海思鲲鹏 Zip)注册到 UADK 后,会在 dev 目录创建字符设备。 要访问加速器资源,需要向用户授予写权限。
$ sudo chmod 777 /dev/hisi_zip-*
在 QEMU 迁移中使用 UADK 压缩
确保按上述方法安装 UADK。
构建 QEMU 时使用
--enable-uadk。例如 configure --target-list=aarch64-softmmu --enable-kvm
--enable-uadk在迁移期间启用 UADK 压缩。
设置
migrate_set_parameter multifd-compression uadk。
UADK 使用 SVA,设备直接访问虚拟内存,因此 SMMUv3 遍历 I/O 页表时
可能发生缺页,影响性能。为减轻影响,
请确保目标虚拟机启动参数包含 -mem-prealloc。
虽然 UADK 和 ZLIB 都基于 deflate,但两者并不完全兼容。 因此迁移时源端和目标端都必须使用 uadk。