[PC周辺] Linux 2.6.23-rc5 git 20070909版 + nvidia-kernel-source 100.14.11-1 (20070909)

という組合せで,nvidia.ko が compile できないという問題.

具体的には,

/usr/src/modules/nvidia-kernel/nv/nv.c: In function 'nvidia_init_module':
/usr/src/modules/nvidia-kernel/nv/nv.c:1326: error: too many arguments to function 'kmem_cache_create'
/usr/src/modules/nvidia-kernel/nv/nv.c:1435: error: too many arguments to function 'kmem_cache_create'
/usr/src/modules/nvidia-kernel/nv/nv.c:1569: error: void value not ignored as it ought to be
/usr/src/modules/nvidia-kernel/nv/nv.c: In function 'nvidia_exit_module':
/usr/src/modules/nvidia-kernel/nv/nv.c:1601: error: void value not ignored as it ought to be

という error でこける.kmem_cache_create に関しては <URL:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=9a79b2274186fade17134929d4f85b70d59a3840#patch115>

struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
                       unsigned long,
-                      void (*)(void *, struct kmem_cache *, unsigned long),
                       void (*)(void *, struct kmem_cache *, unsigned long));

という部分の影響.これに関しては,

diff -uw nv/nv-linux.h.orig nv/nv-linux.h
--- nv/nv-linux.h.orig  2007-09-09 13:49:04.000000000 +0900
+++ nv/nv-linux.h       2007-09-09 13:49:14.000000000 +0900
@@ -533,7 +533,7 @@
 #define NV_KMEM_CACHE_CREATE(kmem_cache, name, type)            \
     {                                                           \
         kmem_cache = kmem_cache_create(name, sizeof(type),      \
-                        0, 0, NULL, NULL);                      \
+                        0, 0, NULL);                      \
     } 

 #define NV_KMEM_CACHE_DESTROY(kmem_cache)                       \

とかして対応.

void value not ignored as it ought to be

とか怒られているのは, <URL:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=e53252d97e670a38b1d2e9723b48077bba11ddda#patch2>

-extern int unregister_chrdev(unsigned int, const char *);
+extern void unregister_chrdev(unsigned int, const char *);

という部分の影響.これに関しては,

diff -uw nv/nv.c.orig nv/nv.c      
--- nv/nv.c.orig        2007-09-09 13:50:30.000000000 +0900                    
+++ nv/nv.c     2007-09-09 13:52:11.000000000 +0900
@@ -1566,8 +1566,7 @@
         if (apm_nv_dev[i] != NULL) pm_unregister(apm_nv_dev[i]);
 #endif

-    if (unregister_chrdev(nv_major, "nvidia") < 0)
-        nv_printf(NV_DBG_ERRORS, "NVRM: unregister nv chrdev failed\n");
+    unregister_chrdev(nv_major, "nvidia");

     for (i = 0; i < num_nv_devices; i++)
     {
@@ -1598,8 +1597,7 @@

     nv_printf(NV_DBG_INFO, "NVRM: nvidia_exit_module\n");

-    if (unregister_chrdev(nv_major, "nvidia") < 0)
-        nv_printf(NV_DBG_ERRORS, "NVRM: unregister nv chrdev failed\n");
+    unregister_chrdev(nv_major, "nvidia");

     for (i = 0; i < num_nv_devices; i++)
     {

とかして対応.

ちなみに普通に nvidia.ko (というか,それを含む .deb) を作る時は,

% sudo module-assistant build nvidia-kernel

とかで済ますのであるが,こけた時の原因を探るには,

% cd /usr/src/modules/nvidia-kernel
% sudo make -f debian/rules KVERS=`uname -r` KSRC=/lib/modules/`uname -r`/source KDREV=0.1 binary_modules

とかで探ってやれば良さげ.nvidia-kernel-source の本体は

/usr/src/nvidia-kernel-source.tar.gz

にあるので,本来はそこに patch をあててやるべきな気がしないでもないが, 上述の make で .deb が吐けるので, kernel をあげる度に対応することに適当に修正をかけることにする.

参照リンク


Last-modified: Tue Aug 26 23:13:09 +0900 2008

全インデックス