特定のブランドのTVチューナーカード(TBSテクノロジー)を使用していますが、ドライバーはカーネルに含まれていないため、カーネルを更新するたびに再構築する必要があります。 4.4.0-143-genericへの昨日のカーネルアップデートをインストールした後、TBSドライバーはビルドに失敗しますが、4.4.0-142-genericに戻ると、それらは動作します。この問題は、makeの実行時に発生し、具体的には、videobuf-dma-sg.oというファイルをビルドしようとしたときに発生し、エラー出力は次のようになります。
CC [M] /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.o
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c: In function 'videobuf_dma_init_user_locked':
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:187:21: warning: passing argument 6 of 'get_user_pages' makes pointer from integer without a cast [-Wint-conversion]
rw == READ, 1, /* force */
^
In file included from include/linux/scatterlist.h:7:0,
from include/linux/dma-mapping.h:10,
from /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:28:
include/linux/mm.h:1222:6: note: expected 'struct page **' but argument is of type 'int'
long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
^
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:188:9: warning: passing argument 7 of 'get_user_pages' from incompatible pointer type [-Wincompatible-pointer-types]
dma->pages, NULL);
^
In file included from include/linux/scatterlist.h:7:0,
from include/linux/dma-mapping.h:10,
from /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:28:
include/linux/mm.h:1222:6: note: expected 'struct vm_area_struct **' but argument is of type 'struct page **'
long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
^
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:185:8: error: too many arguments to function 'get_user_pages'
err = get_user_pages(current, current->mm,
^
In file included from include/linux/scatterlist.h:7:0,
from include/linux/dma-mapping.h:10,
from /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:28:
include/linux/mm.h:1222:6: note: declared here
long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
^
scripts/Makefile.build:291: recipe for target '/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.o' failed
make[3]: *** [/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.o] Error 1
Makefile:1454: recipe for target '_module_/home/backend/Drivers/linux-tbs-drivers/v4l' failed
make[2]: *** [_module_/home/backend/Drivers/linux-tbs-drivers/v4l] Error 2
make[2]: Leaving directory '/usr/src/linux-headers-4.4.0-143-generic'
Makefile:51: recipe for target 'default' failed
make[1]: *** [default] Error 2
make[1]: Leaving directory '/home/backend/Drivers/linux-tbs-drivers/v4l'
Makefile:26: recipe for target 'all' failed
make: *** [all] Error 2
私は基本的にこれらのドライバーを構築するための「レシピ」に従っているため、実際の問題が何であるか、またはそれを解決する方法はわかりません。これがカーネルのこの特定のバージョンのバグなのか、それともドライバの再構築を永久に妨げるような変更があったのかはわかりません。ソースからのビルドについて多くのことを知っている親切な人が、ここで何が起こっているのかについての手がかりを私に与えることができればいいのにと思っていました。以前の4.4.0-142-genericカーネルを使用すると、Makeは問題なく実行され、エラーなしで完了します。何が変わったのでしょうか。
この特定の問題を追跡しようとしている他の人のために、CrazyCatのハンドルを使用するユーザーが この問題を修正するTBSドライバーへのパッチ/アップデート を提供しています。 TBS Driver&Software Updateフォーラムでのこの問題の議論 もあります。
変更されたのは、mm.hファイルのget_user_pages()インターフェイスです。ベースカーネルコードに対するこの変更(1月)は、最終的に4.4.0-143 Ubuntuカーネルリリースまで機能しました。 Nvidiaドライバーと一部のvmドライバーにあらゆる種類の悲しみを引き起こしましたが、それらは書き直されました。あなたのような他のドライバーやoem-hdmi-audio-dkms_0.1_all.debにあるIntel Compute StickのHDMIオーディオドライバーは、書き換えを取得する場合と取得しない場合があります。基本的に、3つの選択肢があります。
一部のマシンはどこかでクラッシュしていたため、LTSカーネルインターフェースの変更は受け入れられると考えていました。個人的には間違っていたと思いますが、私は誰だと思います。この変更はCanonicalの上流で行われたため、バグではなく機能と見なされ、一部の古いドライバーが動作しなくなったため変更される可能性はほとんどありません。