(Erledigt) Nvidia Legacy 340.96 und Kernel 4.6

Status
Für weitere Antworten geschlossen.

Rain_Maker

Administrator
Teammitglied
Moinsen,

Seit kurzem findet man im Repository "Kernel:stable" Pakete mit Kernel 4.6.0.

Wer wie ich den proprietären Nvidia Treiber in der "Legacy" Version 340.96 verwendet, wird zum Bau der entsprechenden Kernelmodule (nvidia.ko und nvidia-uvm.ko) einen kleinen Patch anwenden müssen.

Code:
--- kernel/os-mlock.c.orig      2015-11-09 06:44:53.000000000 +0100
+++ kernel/os-mlock.c   2016-05-18 19:16:33.263103070 +0200
@@ -45,7 +45,11 @@
     }
 
     down_read(&mm->mmap_sem);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
     ret = get_user_pages(current, mm, (unsigned long)address,
+#else
+    ret = get_user_pages((unsigned long)address,
+#endif
             page_count, write, force, user_pages, NULL);
     up_read(&mm->mmap_sem);
     pinned = ret;
@@ -58,7 +62,11 @@
     else if (pinned < page_count)
     {
         for (i = 0; i < pinned; i++)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
             page_cache_release(user_pages[i]);
+#else
+            put_page(user_pages[i]);
+#endif
         os_free_mem(user_pages);
         return RM_ERR_INVALID_ADDRESS;
     }
@@ -85,7 +93,11 @@
     {
         if (write)
             set_page_dirty_lock(user_pages[i]);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
         page_cache_release(user_pages[i]);
+#else
+        put_page(user_pages[i]);
+#endif
     }
 
     os_free_mem(user_pages);
--- kernel/uvm/nvidia_uvm_lite.c.orig   2015-11-09 06:44:53.000000000 +0100
+++ kernel/uvm/nvidia_uvm_lite.c        2016-05-18 19:16:33.263103070 +0200
@@ -785,7 +785,11 @@
         // a reference so that the fault handling logic is correct:
         //
         get_page(pTracking->uvmPage);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
         retValue = VM_FAULT_MINOR;
+#else
+        retValue = 0;
+#endif
     }
 
     pRecord->isMapped = NV_TRUE;
(Siehe auch Anhang, das unnötige ".txt" am Ende ist der Forensoftware geschuldet, die bestimmte Dateiendungen erwartet)

1) Den Patch als einfache Textdatei (z.B. unter dem Namen "nvidia-340.96-4.6.patch") abspeichern.

2) Danach kann er wie folgt angewendet werden:

Code:
./NVIDIA-Linux-<ARCH>-<VERSION>.run --apply-patch <NAME_DER_PATCHDATEI>
oder an einem konkreten Beispiel für den Installer "NVIDIA-Linux-x86_64-340.96-no-compat32.run"

Code:
./NVIDIA-Linux-x86_64-340.96-no-compat32.run --apply-patch nvidia-340.96-4.6.patch

Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 340.96.........................................................................................................................................................................................................
patching file kernel/os-mlock.c
patching file kernel/uvm/nvidia_uvm_lite.c
Adding files to archive named "NVIDIA-Linux-x86_64-340.96-no-compat32-custom.run"...
./.manifest
./html/
./html/xrandrextension.html
./html/xineramaglx.html

----------- snip -----------------

./pkg-history.txt
./LICENSE
./NVIDIA_Changelog

CRC: 3922802423
MD5: 198be0176f3e08cb0b1c0358a082186b

Self-extractible archive "NVIDIA-Linux-x86_64-340.96-no-compat32-custom.run" successfully created.
3) Nun kann man den neu gebauten Installer (hier "NVIDIA-Linux-x86_64-340.96-no-compat32-custom.run") wie gewohnt aufrufen, dann klappts auch mit dem Nachbarn 4.6er Kernel.

Greetz,

RM

Nachtrag:

Last but not least und (nicht nur) für unsere Nostalgiker, hier der Patch als base64-codierte Datei ("man uudecode" hilft weiter).

Code:
begin-base64 644 nvidia-340.96-4.6.patch
LS0tIGtlcm5lbC9vcy1tbG9jay5jLm9yaWcJMjAxNS0xMS0wOSAwNjo0NDo1
My4wMDAwMDAwMDAgKzAxMDAKKysrIGtlcm5lbC9vcy1tbG9jay5jCTIwMTYt
MDUtMTggMTk6MTY6MzMuMjYzMTAzMDcwICswMjAwCkBAIC00NSw3ICs0NSwx
MSBAQAogICAgIH0KIAogICAgIGRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsK
KyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LDYs
MCkKICAgICByZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgKHVu
c2lnbmVkIGxvbmcpYWRkcmVzcywKKyNlbHNlCisgICAgcmV0ID0gZ2V0X3Vz
ZXJfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKyNlbmRpZgogICAg
ICAgICAgICAgcGFnZV9jb3VudCwgd3JpdGUsIGZvcmNlLCB1c2VyX3BhZ2Vz
LCBOVUxMKTsKICAgICB1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogICAgIHBp
bm5lZCA9IHJldDsKQEAgLTU4LDcgKzYyLDExIEBACiAgICAgZWxzZSBpZiAo
cGlubmVkIDwgcGFnZV9jb3VudCkKICAgICB7CiAgICAgICAgIGZvciAoaSA9
IDA7IGkgPCBwaW5uZWQ7IGkrKykKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUg
PCBLRVJORUxfVkVSU0lPTig0LDYsMCkKICAgICAgICAgICAgIHBhZ2VfY2Fj
aGVfcmVsZWFzZSh1c2VyX3BhZ2VzW2ldKTsKKyNlbHNlCisgICAgICAgICAg
ICBwdXRfcGFnZSh1c2VyX3BhZ2VzW2ldKTsKKyNlbmRpZgogICAgICAgICBv
c19mcmVlX21lbSh1c2VyX3BhZ2VzKTsKICAgICAgICAgcmV0dXJuIFJNX0VS
Ul9JTlZBTElEX0FERFJFU1M7CiAgICAgfQpAQCAtODUsNyArOTMsMTEgQEAK
ICAgICB7CiAgICAgICAgIGlmICh3cml0ZSkKICAgICAgICAgICAgIHNldF9w
YWdlX2RpcnR5X2xvY2sodXNlcl9wYWdlc1tpXSk7CisjaWYgTElOVVhfVkVS
U0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oNCw2LDApCiAgICAgICAgIHBh
Z2VfY2FjaGVfcmVsZWFzZSh1c2VyX3BhZ2VzW2ldKTsKKyNlbHNlCisgICAg
ICAgIHB1dF9wYWdlKHVzZXJfcGFnZXNbaV0pOworI2VuZGlmCiAgICAgfQog
CiAgICAgb3NfZnJlZV9tZW0odXNlcl9wYWdlcyk7Ci0tLSBrZXJuZWwvdXZt
L252aWRpYV91dm1fbGl0ZS5jLm9yaWcJMjAxNS0xMS0wOSAwNjo0NDo1My4w
MDAwMDAwMDAgKzAxMDAKKysrIGtlcm5lbC91dm0vbnZpZGlhX3V2bV9saXRl
LmMJMjAxNi0wNS0xOCAxOToxNjozMy4yNjMxMDMwNzAgKzAyMDAKQEAgLTc4
NSw3ICs3ODUsMTEgQEAKICAgICAgICAgLy8gYSByZWZlcmVuY2Ugc28gdGhh
dCB0aGUgZmF1bHQgaGFuZGxpbmcgbG9naWMgaXMgY29ycmVjdDoKICAgICAg
ICAgLy8KICAgICAgICAgZ2V0X3BhZ2UocFRyYWNraW5nLT51dm1QYWdlKTsK
KyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LDYs
MCkKICAgICAgICAgcmV0VmFsdWUgPSBWTV9GQVVMVF9NSU5PUjsKKyNlbHNl
CisgICAgICAgIHJldFZhbHVlID0gMDsKKyNlbmRpZgogICAgIH0KIAogICAg
IHBSZWNvcmQtPmlzTWFwcGVkID0gTlZfVFJVRTsK
====
 

Rain_Maker

Administrator
Teammitglied
Jepp, ist im Prinzip die selbe Vorgehensweise, nur eben ohne "Neuverpacken" der .run-Datei.

Einen wichtigen Unterschied muss ich hier aber heraus stellen, die von Sauerland verlinkte Anleitung bezieht sich auf die 364.X-Serie, also auf die gerade aktuellen Nvidia-Treiber, woraus sich ein paar Konsequenzen ergeben.

1) Der dort verlinkte Patch ist nicht für die Legacytreiber der 340er-Serie geeignet (und vice versa).

2) Wer statt des "brandaktuellen" 364er den aktuellen "long term" 361er verwendet, kann möglicherweise (nicht getestet) mit dem dortigen Patch auch nichts anfangen.

3) Die beiden aktuellen Versionen 364.X und 361.X erhalten im Gegensatz zu den "Legacy"-Treibern öfters Updates, es ist also sehr wahrscheinlich, daß es dort bald neue Versionen geben wird, welche ohne Patches gegen 4.6 bauen, bei den "Legacy"-Versionen kann das durchaus länger dauern.

Und zum Schluss ein allgemeiner Tipp, wo man häufig passende Patches finden kann.

https://devtalk.nvidia.com/default/board/98/linux/

Meist finden sich dort Patches lange bevor der neue Kernel veröffentlicht wird, dort finden sich reichlich Nutzer, die die rc-Kernel testen und diesen fallen dann solche Probleme eben schon sehr früh auf.

Wer in die Suchmaschine seines geringsten Misstrauens also so etwas wie

"Nvidia devtalk Linux $NEUE_KERNEL_VERSION"

eintippt, wird in der Regel sehr schnell fündig.

Beispiel:

https://duckduckgo.com/lite/?q=NVidia+devtalk+Linux+4.6

oder

https://www.ixquick.com/do/metasearch.pl?query=NVidia+devtalk+Linux+4.6

und man landet recht schnell auf:

https://devtalk.nvidia.com/default/topic/926824/linux/364-1-2-5-won-t-compile-against-latest-kernel-git-tree-patches-for-4-6-0-rc3-included-/

Aber auch hier, für die aktuellen Versionen wird man schnell fündig, bei Legacytreibern kann die Suche etwas länger dauern bzw. man muss selbst ein wenig rumklöppeln und die Patches für die aktuellen Versionen können vielleicht als Hilfe dienen, wenn es beim Legacytreiber an den selben Stellen knallt.


Greetz,

RM
 

Sauerland

Member
Wobei ich auch noch anmerken möchte:
Die Installation eines aktuellen Kernels aus kernel:stable ist einfach und auch schnell erledigt, allerdings funktionieren dann meist keine vorkompilierten Kernel-Pakete aus dem OSS- bzw. OSS-Update-Repo. Darüber sollte sich jeder vor der Installation im Klaren sein und z.B. hinterher nicht heulen:
Mein Broadcom-Wlan geht nicht mehr.

Zum Thema Nvidia Treiber:
Wie von Rain_Maker schon angemerkt, benutze ich den aktuellsten Treiber, der ca. alle 4 Wochen neu herauskommt und auch schon einmal von Nvidia als Beta gekennzeichnet ist und auch Probleme bereiten kann.
Dann ist es immer gut, wenn man noch ältere Treiber auf der Festplatte liegen hat und schnell wechseln kann.
 

Rain_Maker

Administrator
Teammitglied
Sauerland schrieb:
Darüber sollte sich jeder vor der Installation im Klaren sein und z.B. hinterher nicht heulen:
Mein Broadcom-Wlan geht nicht mehr.
*Gnihihihihihihihihi*

Danke, das war der Spruch des Tages, ich weiß genau, was (oder genauer WEN) Du damit meinst.

Und solltest Du dafür Ärger bekommen, dann sag' einfach "Ich war jung und brauchte das Geld EUEREHREN..."

Greetz,

R_Insiderscherz_M
 

Rain_Maker

Administrator
Teammitglied
Heute wurde Version 340.98 des Treibers veröffentlicht, welcher zumindest bis Kernel 4.7.5 ohne Patch baut.

Code:
uname -r
4.7.5-1.gc7aed11-default

/sbin/modinfo nvidia 
filename:       /lib/modules/4.7.5-1.gc7aed11-default/updates/nvidia.ko
alias:          char-major-195-*
version:        340.98
supported:      external
license:        NVIDIA
alias:          pci:v000010DEd00000E00sv*sd*bc04sc80i00*
alias:          pci:v000010DEd00000AA3sv*sd*bc0Bsc40i00*
alias:          pci:v000010DEd*sv*sd*bc03sc02i00*
alias:          pci:v000010DEd*sv*sd*bc03sc00i00*
depends:        drm
vermagic:       4.7.5-1.gc7aed11-default SMP preempt mod_unload modversions 
parm:           NVreg_Mobile:int
parm:           NVreg_ResmanDebugLevel:int
parm:           NVreg_RmLogonRC:int
parm:           NVreg_ModifyDeviceFiles:int
parm:           NVreg_DeviceFileUID:int
parm:           NVreg_DeviceFileGID:int
parm:           NVreg_DeviceFileMode:int
parm:           NVreg_RemapLimit:int
parm:           NVreg_UpdateMemoryTypes:int
parm:           NVreg_InitializeSystemMemoryAllocations:int
parm:           NVreg_UsePageAttributeTable:int
parm:           NVreg_MapRegistersEarly:int
parm:           NVreg_RegisterForACPIEvents:int
parm:           NVreg_CheckPCIConfigSpace:int
parm:           NVreg_EnablePCIeGen3:int
parm:           NVreg_EnableMSI:int
parm:           NVreg_MemoryPoolSize:int
parm:           NVreg_RegistryDwords:charp
parm:           NVreg_RmMsg:charp
parm:           NVreg_AssignGpus:charp
Damit sollte sich das Ganze (zumindest bis zum nächsten Update auf 4.8) erledigt haben.

Der Link zum direkten Download des Patches wurde entfernt, da obsolet.


/Nachtrag:
Treiber baut auch gegen 4.8.rc7, sieht also zumindest so aus, als ob man sogar bis 4.9 seine Ruhe hätte,

Da der Patch einige Male in diversen Foren verlinkt wurde, hier noch in Kürze das Ganze in Englisch:

Nvidia released version 340.98 of their prorpietary driver today. This version builds against kernels up to 4.7.5 without any extra patches,

The dowload link to this patch was removed, I recommend upgrading your driver to 340.98.

Greetz,

RM
 
Status
Für weitere Antworten geschlossen.
Oben