Intel DH895XCC Series QAT y ZFS (2.0.0): initramfs personalizados con dracut

Intel DH895XCC Series QAT y ZFS (2.0.0): initramfs personalizados con dracut

Nos gustaría ejecutar ZFS con descarga QAT para compresiones y sumas de comprobación.

La distribución es Centos 8.2 con el kernel stock:

[root@dellqat ~]# uname -a
Linux dellqat 4.18.0-193.19.1.el8_2.x86_64 #1 SMP Mon Sep 14 14:37:00 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

para el QAT tenemos:

qat1.7.l.4.11.0-00001 (lo último de Intel)

./configure --enable-icp-trace --enable-icp-debug --enable-icp-log-syslog --enable-kapi
make
make install

para ZFS tenemos:

[root@dellqat zfs_latest]# git status
On branch zfs-2.0-release
Your branch is up to date with 'origin/zfs-2.0-release'.

nothing to commit, working tree clean

export ICP_ROOT=/opt/A3C/qat1.7.l.4.11.0-00001
./configure --with-qat=/opt/A3C/qat1.7.l.4.11.0-00001
make
make install
ldconfig

El problema es el orden de carga de los módulos: ZFS no utiliza correctamente el QAT porque el módulo zfs se carga antes que el QAT. No solo eso, sino que los módulos QAT se cargan en un script de inicio qat_service donde se utiliza un programa adf_ctl para iniciar los servicios QAT. ¡Este qat_service está programado como el último servicio en ejecutarse!

Básicamente qat_service, lanza un programa adf_ctlpara iniciar los motores qat, por lo que no es solo un problema de orden de carga del módulo: antes de adf_ctlejecutar modprobing para zfs.

Como veo, zfs viene con un módulo dracut zfs-dracut para cargar los módulos en initramfs para particiones raíz en zfs.

¿Alguien tiene experiencia para compartir sobre el uso de Intel QAT con ZFS?

Idealmente, nos gustaría escribir un módulo dracut que vaya antes del módulo zfs dracut para realizar el inicio de QAT en initramfs antes de cargar ZFS.

Respuesta1

De alguna manera lo hice funcionar con un initramfs personalizado con dracut...

Debe excluir los módulos dracut para zfs: 02zfsexpandknowledgey 90zfs.

Luego agrega un módulo personalizado para qat:

[root@dellqat ~]# cd /usr/lib/dracut/modules.d/
[root@dellqat modules.d]# mkdir 89qat

dentro de 89qat pones dos archivos:

[root@dellqat modules.d]# cd 89qat/
[root@dellqat 89qat]# cat module-setup.sh 
#!/usr/bin/env bash

check() {
    return 0
}

depends() {
    return 0
}

installkernel() {
    instmods qat_dh895xcc
    instmods qat_api
    instmods usdm_drv
    instmods intel_qat
    instmods uio
}

install() {
    inst_hook pre-mount 10 "${moddir}/qat_start.sh"
    inst /etc/dh895xcc_dev0.conf /etc/dh895xcc_dev0.conf
    inst /usr/local/bin/adf_ctl /sbin/adf_ctl
    inst /usr/bin/sleep /sbin/sleep
}

y

[root@dellqat 89qat]# cat qat_start.sh
#!/bin/sh

modprobe -r qat_api;
/sbin/sleep 1;
modprobe -r qat_dh895xcc;
/sbin/sleep 1;
modprobe qat_dh895xcc;
/sbin/sleep 1;
modprobe qat_api;
/sbin/sleep 1;
/sbin/adf_ctl restart 1>/dev/null 2>&1;
/sbin/sleep 1;

ambos archivos serán chmod 755.

Luego reconstruyes la imagen con dracut: dracut foobar.img $(uname -r) --force -v

que crean la imagen initramfs "foobar.img" para el kernel actual.

No sé por qué, pero los módulos no se cargan en el orden correcto si también conservas los módulos zfs-dracut: 02zfsexpandknowledgey 90zfs.

¿Quizás alguien con más experiencia con dracut pueda ayudar?

información relacionada