J'utilise une marque particulière de cartes tuner TV (technologies TBS) et les pilotes ne sont pas inclus dans le noyau, ils doivent donc être reconstruits après chaque mise à jour du noyau. Après l'installation de la mise à jour du noyau d'hier à 4.4.0-143-générique, les pilotes TBS ne parviennent pas à se construire, mais si je reviens à 4.4.0-142-générique, ils fonctionnent. Le problème se produit lors de l'exécution de make, en particulier lorsqu'il tente de créer un fichier appelé videobuf-dma-sg.o, et la sortie d'erreur est la suivante:
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
Je suis fondamentalement en train de suivre une "recette" pour construire ces pilotes, donc je n'ai aucune idée du problème réel ni de la façon de le résoudre. Je ne sais pas s'il s'agit d'un bogue dans cette version particulière du noyau, ou si quelque chose a changé qui empêchera à jamais la reconstruction des pilotes. J'espérais que peut-être une personne gentille qui en sait beaucoup plus sur la construction à partir de la source que je ne pourrais peut-être me donner un indice sur ce qui se passe ici, et plus précisément, ce que je pourrais avoir besoin de faire pour y remédier. Faire des exécutions très bien et se termine sans erreurs lors de l'utilisation du noyau générique 4.4.0-142 précédent. Alors qu'est-ce qui a changé, je me demande?
Pour toute autre personne qui essaie de résoudre ce problème spécifique, un utilisateur qui utilise le pseudo CrazyCat a fourni correctifs/mises à jour des pilotes TBS qui résolvent ce problème . Il y a aussi un discussion de ce problème sur le forum TBS Driver & Software Update .
Ce qui a changé, c'est l'interface get_user_pages () du fichier mm.h. Cette modification du code du noyau de base (en janvier) a finalement progressé jusqu'à la version 4.4.0-143 du noyau Ubuntu. Cela a causé toutes sortes de problèmes aux pilotes Nvidia et à certains pilotes vm, mais ils ont été réécrits. D'autres pilotes, comme le vôtre ou le pilote audio HDMI de l'Intel Compute Stick dans oem-hdmi-audio-dkms_0.1_all.deb, peuvent ou non être réécrits. Fondamentalement, vous avez trois choix:
Certaines machines se bloquaient quelque part, donc quelqu'un pensait que changer une interface du noyau LTS était acceptable. Je pense personnellement qu'ils avaient tort, mais qui dois-je dire. Cette modification était en amont de Canonical, donc elle est considérée comme une fonctionnalité, pas un bug, et il est peu probable qu'elle soit modifiée car certains anciens pilotes ne fonctionnent plus.