やるきなし

2017/06/21 19:50 / Debian GNU/Linux stretch の NVIDIA Driver

Kernel は 4.11.6 の自前パッケージ.ドライバのソースは以下の2種類を試した.

Linux 4.11.6 + nvidia-kernel-dkms 375.66-1

嵌ったのは,以下のような2つのファイルを混同してしまう点.conftest.sh でことごとく error がでる.

/usr/src/linux-headers-4.11.6-<version>/include/asm/ をまるごと削除して解決させた.ソースコードの修正は不要.

Linux 4.11.6 + nvidia-legacy-340xx-kernel-dkms 340.102-1

手元に GeForce 8600 (古い)があって,これは最新のドライバではダメで,legacy ドライバを利用する必要がある.ということで仕方なくコンパイル.以下の対応する変更が必要.

以下パッチ.

--- a/conftest.sh
+++ b/conftest.sh
@@ -1579,6 +1579,7 @@ compile_test() {
             #
             CODE="
             #include <linux/sched.h>
+            #include <linux/sched/signal.h>
             void conftest_fatal_signal_pending(void) {
                 fatal_signal_pending();
             }"
--- a/nv-drm.c
+++ b/nv-drm.c
@@ -48,7 +48,7 @@ static int nv_drm_load(
     return -ENODEV;
 }
 
-static int nv_drm_unload(
+static void nv_drm_unload(
     struct drm_device *dev
 )
 {
@@ -64,7 +64,7 @@ static int nv_drm_unload(
         }
     }
 
-    return -ENODEV;
+    return;
 }
 
 static void nv_gem_free(
diff --git a/uvm/nvidia_uvm_linux.h b/uvm/nvidia_uvm_linux.h
index f69c107..3d21a47 100644
--- a/uvm/nvidia_uvm_linux.h
+++ b/uvm/nvidia_uvm_linux.h
@@ -189,6 +189,9 @@
 #include <linux/ratelimit.h>
 #endif
 
+#include <linux/signal.h>
+#include <linux/sched/signal.h>
+
 #if !defined(no_printk)
 //
 // TODO: bug 1329255: instead of this heavy-handed approach, use conftest to
diff --git a/uvm/nvidia_uvm_lite.c b/uvm/nvidia_uvm_lite.c
index 71bebe3..3685dc6 100644
--- a/uvm/nvidia_uvm_lite.c
+++ b/uvm/nvidia_uvm_lite.c
@@ -818,7 +818,7 @@ done:
 }
 
 #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
-int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+int _fault(struct vm_fault *vmf)
 {
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
     unsigned long vaddr = (unsigned long)vmf->virtual_address;
@@ -828,7 +828,7 @@ int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
     struct page *page = NULL;
     int retval;
 
-    retval = _fault_common(vma, vaddr, &page, vmf->flags);
+    retval = _fault_common(vmf->vma, vaddr, &page, vmf->flags);
 
     vmf->page = page;
 
@@ -866,7 +866,7 @@ static struct vm_operations_struct uvmlite_vma_ops =
 // it's dealing with anonymous mapping (see handle_pte_fault).
 //
 #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
-int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+int _sigbus_fault(struct vm_fault *vmf)
 {
     vmf->page = NULL;
     return VM_FAULT_SIGBUS;

Related articles