Intel DH895XCC Series QAT и ZFS (2.0.0) — пользовательские initramfs с dracut

Intel DH895XCC Series QAT и ZFS (2.0.0) — пользовательские initramfs с dracut

Мы хотели бы запустить ZFS с разгрузкой QAT для сжатия и контрольных сумм.

Дистрибутив — Centos 8.2 со стандартным ядром:

[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

для QAT имеем:

qat1.7.l.4.11.0-00001 (последняя версия от Intel)

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

для ZFS имеем:

[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

Проблема в порядке загрузки модулей: ZFS не использует QAT правильно, поскольку модуль zfs загружается до QAT. Более того, модули QAT загружаются в скрипте инициализации qat_service, где для инициализации служб QAT используется программа adf_ctl. Эта служба qat_service запланирована как последняя для запуска!

По сути, они qat_serviceзапускают программу adf_ctlдля запуска движков QAT, поэтому проблема не только в порядке загрузки модулей: перед этим adf_ctlнеобходимо запустить modprobing для ZFS.

Как я вижу, в комплект zfs входит модуль dracut zfs-dracut для загрузки модулей в initramfs для корневых разделов в zfs.

Есть ли у кого-нибудь опыт использования Intel QAT с ZFS?

В идеале мы хотели бы написать модуль dracut, который будет предшествовать модулю zfs dracut для выполнения инициализации QAT в initramfs перед загрузкой ZFS.

решение1

У меня вроде как заработало с кастомным initramfs с dracut...

Необходимо исключить модули dracut для zfs: 02zfsexpandknowledgeи 90zfs.

Затем вы добавляете пользовательский модуль для qat:

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

внутри 89qat вы помещаете два файла:

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

и

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

Оба файла должны иметь права chmod 755.

Затем вы перестраиваете изображение с помощью dracut: dracut foobar.img $(uname -r) --force -v

которые создают образ initramfs "foobar.img" для текущего ядра.

Я не знаю почему, но модули не загружаются в правильном порядке, если вы также сохраняете модули zfs-dracut: 02zfsexpandknowledgeи 90zfs.

Может быть, кто-то с большим опытом работы с dracut сможет помочь?

Связанный контент