PT3のドライバ更新が失敗した (kernel 5.19.1-arch2-1)

TL;DR

  • ArchLinuxにてpacman -Syuした際に、DKMSによるドライバ更新が失敗した
  • 原因はカーネルバージョンアップに際し、レガシー関数pci_alloc_consistentにエラーが出るようになったため
  • 既に対応パッチが出てるので、リポジトリを取り直して再ビルドしましょう
    m-tsudo · GitHub

詳細

pacmanでこんな内容のエラーが出ました。

:: パッケージを取得します...
 linux-5.19.1.arch2-1-x86_64                                                                                   178.4 MiB  4.32 MiB/s 00:41 [#####################################################################################] 100%


(10/16) Updating module dependencies...
depmod: ERROR: failed to load symbols from /lib/modules/5.19.1-arch2-1/kernel/sound/soc/intel/avs/snd-soc-avs.ko.zst: Invalid argument
(11/16) Install DKMS modules
==> dkms install --no-depmod pt3_drv/0.0.1 -k 5.19.1-arch2-1
Error! Bad return status for module build on kernel: 5.19.1-arch2-1 (x86_64)
Consult /var/lib/dkms/pt3_drv/0.0.1/build/make.log for more information.
==> WARNING: `dkms install --no-depmod pt3_drv/0.0.1 -k 5.19.1-arch2-1' exited 10

ログファイルの内容はこんな感じ。

最後の方にある「いくつかの警告はエラーとして取り扱われます」 という一文がなんとなく怪しいですね。

$ cat /var/lib/dkms/pt3_drv/0.0.1/build/make.log
DKMS make.log for pt3_drv-0.0.1 for kernel 5.19.1-arch2-1 (x86_64)
2022年  8月 16日 火曜日 22:08:37 JST
eval `sed -e "s/\[0\]//" ./dkms.conf`; \
GREV=`git rev-list HEAD | wc -l 2> /dev/null`; \
if [ $GREV != 0 ] ; then \
    printf "#define DRV_VERSION \"${PACKAGE_VERSION}rev$GREV\"\n#define DRV_RELDATE \"`git show --date=short --format=%ad | sed -n '1p' 2> /dev/null`\"\n#define DRV_NAME \"${BUILT_MODULE_NAME}\"\n" > version.h; \
else \
    printf "#define DRV_VERSION \"${PACKAGE_VERSION}\"\n#define DRV_RELDATE \"$PACKAGE_RELDATE\"\n#define DRV_NAME \"${BUILT_MODULE_NAME}\"\n" > version.h; \
fi
fatal: detected dubious ownership in repository at '/var/lib/dkms/pt3_drv/0.0.1/build'
To add an exception for this directory, call:

    git config --global --add safe.directory /var/lib/dkms/pt3_drv/0.0.1/build
make -C /lib/modules/5.19.1-arch2-1/build M=`pwd` V=0 modules
make[1]: 警告: jobserver が利用不可: 今回は -j1 を使います. 親 make ルールに `+' を追加しましょう.
make[1]: ディレクトリ '/usr/lib/modules/5.19.1-arch2-1/build' に入ります
  CC [M]  /var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.o
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c: 関数 ‘pt3_pci_init_one’ 内:
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c:923:14: エラー: 関数 ‘pci_set_dma_mask’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
  923 |         rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
      |              ^~~~~~~~~~~~~~~~
/var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.c:925:22: エラー: 関数 ‘pci_set_consistent_dma_mask’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
  925 |                 rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
      |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: いくつかの警告はエラーとして取り扱われます
make[2]: *** [scripts/Makefile.build:249: /var/lib/dkms/pt3_drv/0.0.1/build/pt3_pci.o] エラー 1
make[1]: *** [Makefile:1843: /var/lib/dkms/pt3_drv/0.0.1/build] エラー 2
make[1]: ディレクトリ '/usr/lib/modules/5.19.1-arch2-1/build' から出ます
make: *** [Makefile:12: pt3_drv.ko] エラー 2

自分でオプションを変更してもよかったのですが、この類のエラーは自分の環境だけではないだろうと思い、
upstreamを確認したところ以下のようなコミットを見つけました。

 commit c10619da580e3a801b205df2ba4a95a850a38786
  Author: fix@elementz <fix@elemsoft.com>
   Date:   Sat Jun 18 01:15:05 2022 +0900
   
       Fix compile error on kernel 5.18.
   
   M   pt3_dma.c
   M   pt3_pci.c

という訳で、あとはgitからソースを再取得してインストール&DKMSをやり直して終了です。

$ sudo /bin/bash ./dkms.install  
[sudo] fuha のパスワード:
Deleting module pt3_drv-0.0.1 completely from the DKMS tree.
rm -vf /lib/modules/`uname -r`/kernel/drivers/video/pt3_drv.ko* /etc/udev/rules.d/99-pt3.rules
'/usr/src/pt3_drv-0.0.1/pt3_tc.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_bus.c' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_bus.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_mx.c' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_i2c.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_i2c.c' を削除しました
'/usr/src/pt3_drv-0.0.1/dkms.install' を削除しました
'/usr/src/pt3_drv-0.0.1/.gitignore' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_tc.c' を削除しました
'/usr/src/pt3_drv-0.0.1/Makefile' を削除しました
'/usr/src/pt3_drv-0.0.1/COPYING' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/logs/HEAD' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/logs/refs/heads/master' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/heads' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes/origin/HEAD' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes/origin' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs/remotes' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs/refs' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/logs' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/description' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/objects/pack/pack-74a2bbe7e502032cbbc16ae0607eb906cb1d65ea.idx' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/objects/pack/pack-74a2bbe7e502032cbbc16ae0607eb906cb1d65ea.pack' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects/pack' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects/info' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/objects' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/HEAD' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/refs/heads/master' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/heads' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/refs/remotes/origin/HEAD' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/remotes/origin' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/remotes' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs/tags' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/refs' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/packed-refs' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/fsmonitor-watchman.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-merge-commit.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-push.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/push-to-checkout.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-rebase.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/applypatch-msg.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/post-update.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-receive.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-applypatch.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/commit-msg.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/update.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/prepare-commit-msg.sample' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/hooks/pre-commit.sample' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/hooks' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/config' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/branches' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/index' を削除しました
'/usr/src/pt3_drv-0.0.1/.git/info/exclude' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git/info' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/.git' を削除しました
'/usr/src/pt3_drv-0.0.1/td/check_lfsr.c' を削除しました
'/usr/src/pt3_drv-0.0.1/td/.gitignore' を削除しました
'/usr/src/pt3_drv-0.0.1/td/Makefile' を削除しました
'/usr/src/pt3_drv-0.0.1/td/td.c' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/td' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_com.h' を削除しました
'/usr/src/pt3_drv-0.0.1/dkms.uninstall' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_qm.c' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_ioctl.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_pci.c' を削除しました
'/usr/src/pt3_drv-0.0.1/README' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_dma.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_pci.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_qm.h' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_dma.c' を削除しました
'/usr/src/pt3_drv-0.0.1/etc/99-pt3.rules' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1/etc' を削除しました
'/usr/src/pt3_drv-0.0.1/pt3_mx.h' を削除しました
'/usr/src/pt3_drv-0.0.1/dkms.conf' を削除しました
ディレクトリ '/usr/src/pt3_drv-0.0.1' を削除しました
Creating symlink /var/lib/dkms/pt3_drv/0.0.1/source -> /usr/src/pt3_drv-0.0.1
Sign command: /usr/lib/modules/5.19.1-arch2-1/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub

Building module:
Cleaning build area....
make -j2 KERNELRELEASE=5.19.1-arch2-1 KVER=5.19.1-arch2-1 dkms..........................
Signing module /var/lib/dkms/pt3_drv/0.0.1/build/pt3_drv.ko
Cleaning build area...kj

pt3_drv.ko.zst:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /usr/lib/modules/5.19.1-arch2-1/updates/dkms/
depmod.................

あとがき

注意点として、pacmanによる更新をした直後だと「uname -r」で取れるカーネルバージョンが昔のバージョンのままのため、linux-headerのバージョンが合わずMakeが失敗する。 Make前に一回再起動することで回避ができる。