web-dev-qa-db-ja.com

カーネルを4.4.0-143-genericにアップデートした後、チューナーカードドライバーのビルドが失敗するのはなぜですか?

特定のブランドの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は問題なく実行され、エラーなしで完了します。何が変わったのでしょうか。

6
UbuntuUser

この特定の問題を追跡しようとしている他の人のために、CrazyCatのハンドルを使用するユーザーが この問題を修正するTBSドライバーへのパッチ/アップデート を提供しています。 TBS Driver&Software Updateフォーラムでのこの問題の議論 もあります。

1
UbuntuUser

変更されたのは、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つの選択肢があります。

  1. 4.4.0-142カーネルを使い続けます。将来のすべてのカーネルパッチを忘れてください。4.4シリーズは、ドライバーが書き直されるまで死んでしまいます。これについてはカードベンダーにお問い合わせください。新しいドライバーがインストールされている可能性があります。
  2. ドライバーを自分で書き換えます。悪くないかもしれませんが、このインターフェースは過去に変更があったようで、現在のインターフェースはいくつかのことを取り消しています。カーネルコードの経験がない限り、試行しないでください。セキュリティとそのカードの使用が重要な場合は、ドライバを修正するためにサードパーティの開発者を雇うかもしれません。
  3. ドライバーをサポートする新しいカーネルを探すために時間をかけてください。 HDMIオーディオは4.18などの新しいカーネルで修正されているので、OS /カーネルをアップグレードできます。繰り返しますが、カードのベンダーに確認してください。彼らは、それ以降のカーネルに動作するドライバー(ある場合)が含まれていることを知っているかもしれません。

一部のマシンはどこかでクラッシュしていたため、LTSカーネルインターフェースの変更は受け入れられると考えていました。個人的には間違っていたと思いますが、私は誰だと思います。この変更はCanonicalの上流で行われたため、バグではなく機能と見なされ、一部の古いドライバーが動作しなくなったため変更される可能性はほとんどありません。

7
ubfan1