Intel série DH895XCC QAT e ZFS (2.0.0) - initramfs personalizado com dracut

Intel série DH895XCC QAT e ZFS (2.0.0) - initramfs personalizado com dracut

Gostaríamos de executar o ZFS com descarregamento QAT para compactações e somas de verificação.

A distribuição é Centos 8.2 com o kernel padrão:

[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 o QAT temos:

qat1.7.l.4.11.0-00001 (mais recente da Intel)

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

para ZFS temos:

[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

O problema é a ordem de carregamento do módulo: o ZFS não usa corretamente o QAT porque o módulo zfs é carregado antes do QAT. Não apenas isso, mas os módulos QAT são carregados em um script de inicialização qat_service onde o uso de um programa adf_ctl é feito para iniciar os serviços QAT. Este qat_service está agendado como o último serviço a ser executado!

Basicamente qat_service, lança um programa adf_ctlpara iniciar os motores qat, portanto, não é apenas um problema de ordem de carregamento do módulo: antes que o modprobing para zfs adf_ctlseja executado.

Pelo que vejo, o zfs vem com um módulo dracut zfs-dracut para carregar os módulos no initramfs para partições raiz no zfs.

Alguém tem experiência para compartilhar sobre o uso do Intel QAT com ZFS?

Idealmente, gostaríamos de escrever um módulo dracut que vá antes do módulo zfs dracut para executar o init do QAT no initramfs antes de carregar o ZFS.

Responder1

Eu meio que consegui trabalhar com um initramfs personalizado com dracut ...

Você deve excluir os módulos dracut para zfs: 02zfsexpandknowledgee 90zfs.

Em seguida, você adiciona um módulo personalizado para qat:

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

dentro do 89qat você coloca dois arquivos:

[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
}

e

[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 os arquivos devem ser chmod 755.

você então reconstrói a imagem com dracut: dracut foobar.img $(uname -r) --force -v

que cria a imagem initramfs "foobar.img" para o kernel atual.

Não sei por que, mas os módulos não carregam na ordem correta se você mantiver também os módulos zfs-dracut: 02zfsexpandknowledgee 90zfs.

Talvez alguém com mais experiência com dracut possa ajudar?

informação relacionada