(Erledigt) Nvidia Legacy 340.98/340.101 und Kernel 4.9

Status
Für weitere Antworten geschlossen.

Rain_Maker

Administrator
Teammitglied
Whoops, das war wohl nix.

Mit dem obigen Patch baut zwar der Treiber, aber das Modul will sich nicht wirklich laden lassen.

Vorigen Patch für den 340.98 zur Sicherheit gelöscht, bis eine funktionierende Lösung da ist, der verlinkte Patch für 370/375 scheint aber für diese Versionen zu funktionieren.

Greetz,

RM
 

Rain_Maker

Administrator
Teammitglied
Was lange währt .....

... wird endlich Patch.

Manchmal sind es eben nur Kleinigkeiten.

Den entscheidenden Hinweis fand ich ausnahmsweise mal nicht bei den "üblichen Verdächtigen" (= bleeding edge distros wie Arch etc.), sondern bei *Buntu:

https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-340/340.98-0ubuntu2

Credit goes to Michael Marley for finding out about the new required DRIVER_LEGACY flag.
Bei einem kurzen Blick in den dort verlinkten Patch findet man zunächst das hier

Code:
--- nv-linux.h.orig     2016-09-20 02:01:21.000000000 +0200
+++ nv-linux.h  2016-10-31 15:10:03.415534198 +0100
@@ -2065,8 +2065,13 @@
     #define NV_GET_USER_PAGES           get_user_pages
     #define NV_GET_USER_PAGES_REMOTE    get_user_pages_remote
 #else
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
     #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \
         get_user_pages(current, current->mm, start, nr_pages, write, force, pages, vmas)
+#else
+    #define NV_GET_USER_PAGES(start, nr_pages, gup_flags, pages, vmas) \
+        get_user_pages(current, current->mm, start, nr_pages, gup_flags, pages, vmas)
+#endif
 
     #define NV_GET_USER_PAGES_REMOTE    get_user_pages
 #endif
--- os-mlock.c.orig     2016-09-20 02:01:20.000000000 +0200
+++ os-mlock.c  2016-10-31 15:11:44.131531222 +0100
@@ -46,7 +46,11 @@
 
     down_read(&mm->mmap_sem);
     ret = NV_GET_USER_PAGES((unsigned long)address,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
                             page_count, write, force, user_pages, NULL);
+#else
+                            page_count, write ? FOLL_WRITE : 0, user_pages, NULL);
+#endif
     up_read(&mm->mmap_sem);
     pinned = ret;
so weit waren wir schon im ersten Posting, aber da kommt eben noch das hier hinzu

Code:
--- nv-drm.c.orig       2016-09-20 02:01:20.000000000 +0200
+++ nv-drm.c    2016-12-14 15:19:06.484533335 +0100
@@ -115,7 +115,11 @@
 };
 
 static struct drm_driver nv_drm_driver = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
     .driver_features = DRIVER_GEM | DRIVER_PRIME,
+#else
+    .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
+#endif
     .load = nv_drm_load,
     .unload = nv_drm_unload,
     .fops = &nv_drm_fops,
und schon flutscht es mit dem 340.98 unter Linux 4.9.

Greetz,

RM

P.S. Den originalen Patch habe ich leicht umgeschrieben, das sah so aus

Code:
--- a/nv-drm.c
+++ b/nv-drm.c
@@ -115,7 +115,11 @@ static const struct file_operations nv_drm_fops = {
 };
 
 static struct drm_driver nv_drm_driver = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
+    .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
+#else
     .driver_features = DRIVER_GEM | DRIVER_PRIME,
+#endif
     .load = nv_drm_load,
     .unload = nv_drm_unload,
     .fops = &nv_drm_fops,
was aber im Prinzip genau das selbe macht (kleine Logikhausaufgabe für den geneigten Querleser, deshalb auch keine Erklärung warum das so ist).
 

Rain_Maker

Administrator
Teammitglied
Werde ich dann mal testen müssen, bei meiner bevorzugten Bezugsquelle

ftp://download.nvidia.com/XFree86/Linux-x86_64

bzw.

http://http.download.nvidia.com/XFree86/

ist da zur Zeit noch nichts zum 340.101 zu finden.

Aber vermutlich habe ich mir wegen ein paar Stunden zu wenig gewartet

(aka "den 4.9.0er aus kernel:stable muss ich jetzt aber _DRINGEND_ und _SOFORT_ installieren" oder auch als "chronische Versionitis" bekannt)

unnötige Arbeit gemacht.

Greetz,

RM
 

Sauerland

Member
Rain_Maker schrieb:
(aka "den 4.9.0er aus kernel:stable muss ich jetzt aber _DRINGEND_ und _SOFORT_ installieren" oder auch als "chronische Versionitis" bekannt)
Läuft hier, aber mit ner 650TI Nvidia.
Code:
nvidia-settings -v && uname -a

nvidia-settings:  version 375.26  (buildmeister@swio-display-x86-rhel47-01)  Thu
Dec  8 19:06:44 PST 2016
  The NVIDIA X Server Settings tool.

  This program is used to configure the NVIDIA Linux graphics driver.
  For more detail, please see the nvidia-settings(1) man page.

Linux linux64 4.9.0-1.g8c92422-default #1 SMP PREEMPT Mon Dec 12 15:54:28 UTC 2016 (8c92422) x86_64 x86_64 x86_64 GNU/Linux
 

Rain_Maker

Administrator
Teammitglied
Jo, aber auch anderer Treiber, der 375er hatte schon seit ein paar Wochen eine Version, die mit 4.9.x ohne Patches funktionierte, für den 340er gab es bis vor ein paar Stunden eben noch nichts und ich hatte mich dann halt auf die Suche gemacht.

Bin gerade dabei meine "hausgemachten" RPMs für den 340.101 zusammen zu schustern, mal schauen, was passiert.

//Edit:

Das war komplizierter als gedacht.

Zuerst die gute Nachricht:

Der 340.101 baut gegen kernel 4.9.0 ohne Patches.

Jetzt die schlechte:

Das Modul lässt sich genau so wenig laden wie in Beitrag #2 dieses Threads beschrieben (selbe Fehlermeldung).

Und nun wurde es seltsam, ich hatte nur die neuen Dateien drübergebügelt, modul nvidia entladen und beim Versuch das Kernelmodul nvidia.ko neu zu laden hat es dann geknallt. Das hat eigentlich seit Jahren bei jedem Update des Treibers ohne Ärger funktioniert, also dachte ich dass etwas am Treiber faul sein musste.

Nun denn, also habe ich zunächst wieder ein Downgrade auf (meinen gepatchten) 340.98 versucht, aber auch da liess sich das Modul nicht mehr laden, der Puls ging leicht hoch, das gefiel mir gar nicht.

Letzte Rettung, "Reboot tut gut"?

Und ja, nach einem Neustart ließ sich dann zumindest wieder das "alte" Modul (340.89 gepatcht) laden und ich habe das Spielchen nochmal versucht, also alles auf 340.101 "hochgezogen" aber dieses mal mit Neustart des Systems.

Und wieder hat es mächtig gekracht, Modul kann nicht geladen werden, irgendwas läuft beim Zusammenspiel mit drm.ko und der Registrierung des Modules im proc-Dateisystem falsch.

OK, dann eben als nächsten Versuch den dritten Teil des Patches für 340.98 in die Sourcen des 340.101 eingebaut

Code:
--- nv-drm.c.orig       2016-09-20 02:01:20.000000000 +0200
+++ nv-drm.c    2016-12-14 15:19:06.484533335 +0100
@@ -115,7 +115,11 @@
 };
 
 static struct drm_driver nv_drm_driver = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
     .driver_features = DRIVER_GEM | DRIVER_PRIME,
+#else
+    .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
+#endif
     .load = nv_drm_load,
     .unload = nv_drm_unload,
     .fops = &nv_drm_fops,
Kernelmodul neu gebaut, System komplett neu gestartet und siehe da .....

Code:
[   44.001176] [drm] Initialized nvidia-drm 0.0.0 20150116 for 0000:01:00.0 on minor 0
[   44.001200] NVRM: loading NVIDIA UNIX x86_64 Kernel Module  340.101  Thu Dec  1 15:52:31 PST 2016
und

Code:
glxinfo | grep nvidia

server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation
OpenGL core profile version string: 3.3.0 NVIDIA 340.101
OpenGL core profile shading language version string: 3.30 NVIDIA via Cg compiler
OpenGL version string: 3.3.0 NVIDIA 340.101
OpenGL shading language version string: 3.30 NVIDIA via Cg compiler
OpenGL ES profile version string: OpenGL ES 2.0 NVIDIA 340.101 340.101

uname -a
Linux OlleKiste 4.9.0-1.g8c92422-default #1 SMP PREEMPT Mon Dec 12 15:54:28 UTC 2016 (8c92422) x86_64 x86_64 x86_64 GNU/Linux
Schlussfolgerung, der letzte Teil des Patches wird auch für den 340.101 benötigt, damit er unter 4.9 überhaupt läuft.

Was ne schwere Geburt und es wird nun wohl Zeit den Threadtitel zu ändern.

Greetz,

RM
 

Rain_Maker

Administrator
Teammitglied
Jepp, sonst hätte ich mir die Mühe eher nicht gemacht (trotz chronischer Versionitis und starker Neugierde).

Die betroffene Kiste läuft zur Zeit noch mit 42.1, aber ein Update auf 42.2 (Xorg server 1.18) oder gar Tumbleweed stehen an und bei letzterem bräuchte man dann diese Unterstützung für 1.19.

Bin mal gespannt, was jetzt die nächsten Tage/Wochen bei den "bleeding edge" Distros passiert, es kann ja auch sein, dass das Problem spezifisch für die Kernelkonfiguration der openSUSE-Kernel ist.

Zumindest liegt also für Notfälle hier ein Patch bereit, den ich dann noch als base64 uuencoded "blob" hinterlege.

Code:
begin-base64 644 nvidia-340.101-4.9.diff
LS0tIGtlcm5lbC9udi1kcm0uYy5vcmlnCTIwMTYtMTItMDEgMjM6NDg6Mjgu
MDAwMDAwMDAwICswMTAwCisrKyBrZXJuZWwvbnYtZHJtLmMJMjAxNi0xMi0x
NSAxODoyNDoyOS45MzQ5MTEyMTMgKzAxMDAKQEAgLTExNSw3ICsxMTUsMTEg
QEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBudl9kcm1fZHJp
dmVyID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJT
SU9OKDQsIDksIDApCiAgICAgLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9H
RU0gfCBEUklWRVJfUFJJTUUsCisjZWxzZQorICAgIC5kcml2ZXJfZmVhdHVy
ZXMgPSBEUklWRVJfR0VNIHwgRFJJVkVSX1BSSU1FIHwgRFJJVkVSX0xFR0FD
WSwKKyNlbmRpZgogICAgIC5sb2FkID0gbnZfZHJtX2xvYWQsCiAgICAgLnVu
bG9hZCA9IG52X2RybV91bmxvYWQsCiAgICAgLmZvcHMgPSAmbnZfZHJtX2Zv
cHMsCg==
====
1) Obigen "Buchstaben-/Zahlensalat" in die Zwischenablage kopieren (ohne Zeilennummern versteht sich) am einfachsten ist es auf das Symbol rechts oberhalb des CODE-Fensters ("Inhalt kopieren") zu klicken.

2) "Dekodieren" (uudecode sollte im Paket sharutils vorhanden sein).

Code:
echo "begin-base64 644 nvidia-340.101-4.9.diff
LS0tIGtlcm5lbC9udi1kcm0uYy5vcmlnCTIwMTYtMTItMDEgMjM6NDg6Mjgu
MDAwMDAwMDAwICswMTAwCisrKyBrZXJuZWwvbnYtZHJtLmMJMjAxNi0xMi0x
NSAxODoyNDoyOS45MzQ5MTEyMTMgKzAxMDAKQEAgLTExNSw3ICsxMTUsMTEg
QEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBudl9kcm1fZHJp
dmVyID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJT
SU9OKDQsIDksIDApCiAgICAgLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9H
RU0gfCBEUklWRVJfUFJJTUUsCisjZWxzZQorICAgIC5kcml2ZXJfZmVhdHVy
ZXMgPSBEUklWRVJfR0VNIHwgRFJJVkVSX1BSSU1FIHwgRFJJVkVSX0xFR0FD
WSwKKyNlbmRpZgogICAgIC5sb2FkID0gbnZfZHJtX2xvYWQsCiAgICAgLnVu
bG9hZCA9IG52X2RybV91bmxvYWQsCiAgICAgLmZvcHMgPSAmbnZfZHJtX2Zv
cHMsCg==
====" | uudecode
Im Verzeichnis des ausgeführten Befehls sollte nun eine Datei "nvidia-340.101-4.9.diff" vorliegen

3) Falls ja, prüfen, ob alles geklappt hat:

Code:
md5sum nvidia-340.101-4.9.diff 
8f85a6a498d5ca091640efc18549c1c3  nvidia-340.101-4.9.diff
4) Patch auf Installeranwenden

Code:
bash ./NVIDIA-Linux-x86_64-340.101-no-compat32.run --apply-patch nvidia-340.101-4.9.diff 
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 340.101........

----snip ----
Self-extractible archive "NVIDIA-Linux-x86_64-340.101-no-compat32-custom.run" successfully created.
Und dann wie gehabt mit dem "custom"-Installer verfahren.

Greetz,

RM
 
Status
Für weitere Antworten geschlossen.
Oben