(Erledigt) Nvidia Legacy 340.98/340.101 und Kernel 4.9

    (Erledigt) Nvidia Legacy 340.98/340.101 und Kernel 4.9

    Kurz und knapp:

    Seit Kernel 4.9-rc2 kompilieren diverse Treiber von NVIDIA nicht mehr.

    Wer Genaueres erfahren will, der findet hier Infos (und einen Patch für die aktuellen Treiber 36X bzw 37X).

    devtalk.nvidia.com/default/top…-rc1-375-10-build-errors/

    Für den Legacy-Treiber 340.98 wird der Patch etwas übersichtlicher:

    ***gelöscht***

    Greetz,

    RM
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K
    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
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

    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:

    bugs.launchpad.net/ubuntu/+sou…ivers-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

    Unterschiede-Datei

    1. --- nv-linux.h.orig 2016-09-20 02:01:21.000000000 +0200
    2. +++ nv-linux.h 2016-10-31 15:10:03.415534198 +0100
    3. @@ -2065,8 +2065,13 @@
    4. #define NV_GET_USER_PAGES get_user_pages
    5. #define NV_GET_USER_PAGES_REMOTE get_user_pages_remote
    6. #else
    7. +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
    8. #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \
    9. get_user_pages(current, current->mm, start, nr_pages, write, force, pages, vmas)
    10. +#else
    11. + #define NV_GET_USER_PAGES(start, nr_pages, gup_flags, pages, vmas) \
    12. + get_user_pages(current, current->mm, start, nr_pages, gup_flags, pages, vmas)
    13. +#endif
    14. #define NV_GET_USER_PAGES_REMOTE get_user_pages
    15. #endif
    16. --- os-mlock.c.orig 2016-09-20 02:01:20.000000000 +0200
    17. +++ os-mlock.c 2016-10-31 15:11:44.131531222 +0100
    18. @@ -46,7 +46,11 @@
    19. down_read(&mm->mmap_sem);
    20. ret = NV_GET_USER_PAGES((unsigned long)address,
    21. +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
    22. page_count, write, force, user_pages, NULL);
    23. +#else
    24. + page_count, write ? FOLL_WRITE : 0, user_pages, NULL);
    25. +#endif
    26. up_read(&mm->mmap_sem);
    27. pinned = ret;


    so weit waren wir schon im ersten Posting, aber da kommt eben noch das hier hinzu

    Unterschiede-Datei

    1. --- nv-drm.c.orig 2016-09-20 02:01:20.000000000 +0200
    2. +++ nv-drm.c 2016-12-14 15:19:06.484533335 +0100
    3. @@ -115,7 +115,11 @@
    4. };
    5. static struct drm_driver nv_drm_driver = {
    6. +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
    7. .driver_features = DRIVER_GEM | DRIVER_PRIME,
    8. +#else
    9. + .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
    10. +#endif
    11. .load = nv_drm_load,
    12. .unload = nv_drm_unload,
    13. .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

    Unterschiede-Datei

    1. --- a/nv-drm.c
    2. +++ b/nv-drm.c
    3. @@ -115,7 +115,11 @@ static const struct file_operations nv_drm_fops = {
    4. };
    5. static struct drm_driver nv_drm_driver = {
    6. +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
    7. + .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
    8. +#else
    9. .driver_features = DRIVER_GEM | DRIVER_PRIME,
    10. +#endif
    11. .load = nv_drm_load,
    12. .unload = nv_drm_unload,
    13. .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).
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K
    Werde ich dann mal testen müssen, bei meiner bevorzugten Bezugsquelle

    download.nvidia.com/XFree86/Linux-x86_64

    bzw.

    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
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

    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.

    Quellcode

    1. nvidia-settings -v && uname -a
    2. nvidia-settings: version 375.26 (buildmeister@swio-display-x86-rhel47-01) Thu
    3. Dec 8 19:06:44 PST 2016
    4. The NVIDIA X Server Settings tool.
    5. This program is used to configure the NVIDIA Linux graphics driver.
    6. For more detail, please see the nvidia-settings(1) man page.
    7. 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
    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

    Unterschiede-Datei

    1. --- nv-drm.c.orig 2016-09-20 02:01:20.000000000 +0200
    2. +++ nv-drm.c 2016-12-14 15:19:06.484533335 +0100
    3. @@ -115,7 +115,11 @@
    4. };
    5. static struct drm_driver nv_drm_driver = {
    6. +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
    7. .driver_features = DRIVER_GEM | DRIVER_PRIME,
    8. +#else
    9. + .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY,
    10. +#endif
    11. .load = nv_drm_load,
    12. .unload = nv_drm_unload,
    13. .fops = &nv_drm_fops,


    Kernelmodul neu gebaut, System komplett neu gestartet und siehe da .....

    Quellcode

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


    und

    Quellcode

    1. glxinfo | grep nvidia
    2. server glx vendor string: NVIDIA Corporation
    3. client glx vendor string: NVIDIA Corporation
    4. OpenGL vendor string: NVIDIA Corporation
    5. OpenGL core profile version string: 3.3.0 NVIDIA 340.101
    6. OpenGL core profile shading language version string: 3.30 NVIDIA via Cg compiler
    7. OpenGL version string: 3.3.0 NVIDIA 340.101
    8. OpenGL shading language version string: 3.30 NVIDIA via Cg compiler
    9. OpenGL ES profile version string: OpenGL ES 2.0 NVIDIA 340.101 340.101
    10. uname -a
    11. 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
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K
    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.

    Quellcode

    1. begin-base64 644 nvidia-340.101-4.9.diff
    2. LS0tIGtlcm5lbC9udi1kcm0uYy5vcmlnCTIwMTYtMTItMDEgMjM6NDg6Mjgu
    3. MDAwMDAwMDAwICswMTAwCisrKyBrZXJuZWwvbnYtZHJtLmMJMjAxNi0xMi0x
    4. NSAxODoyNDoyOS45MzQ5MTEyMTMgKzAxMDAKQEAgLTExNSw3ICsxMTUsMTEg
    5. QEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBudl9kcm1fZHJp
    6. dmVyID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJT
    7. SU9OKDQsIDksIDApCiAgICAgLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9H
    8. RU0gfCBEUklWRVJfUFJJTUUsCisjZWxzZQorICAgIC5kcml2ZXJfZmVhdHVy
    9. ZXMgPSBEUklWRVJfR0VNIHwgRFJJVkVSX1BSSU1FIHwgRFJJVkVSX0xFR0FD
    10. WSwKKyNlbmRpZgogICAgIC5sb2FkID0gbnZfZHJtX2xvYWQsCiAgICAgLnVu
    11. bG9hZCA9IG52X2RybV91bmxvYWQsCiAgICAgLmZvcHMgPSAmbnZfZHJtX2Zv
    12. cHMsCg==
    13. ====


    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).

    Quellcode

    1. echo "begin-base64 644 nvidia-340.101-4.9.diff
    2. LS0tIGtlcm5lbC9udi1kcm0uYy5vcmlnCTIwMTYtMTItMDEgMjM6NDg6Mjgu
    3. MDAwMDAwMDAwICswMTAwCisrKyBrZXJuZWwvbnYtZHJtLmMJMjAxNi0xMi0x
    4. NSAxODoyNDoyOS45MzQ5MTEyMTMgKzAxMDAKQEAgLTExNSw3ICsxMTUsMTEg
    5. QEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBudl9kcm1fZHJp
    6. dmVyID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJT
    7. SU9OKDQsIDksIDApCiAgICAgLmRyaXZlcl9mZWF0dXJlcyA9IERSSVZFUl9H
    8. RU0gfCBEUklWRVJfUFJJTUUsCisjZWxzZQorICAgIC5kcml2ZXJfZmVhdHVy
    9. ZXMgPSBEUklWRVJfR0VNIHwgRFJJVkVSX1BSSU1FIHwgRFJJVkVSX0xFR0FD
    10. WSwKKyNlbmRpZgogICAgIC5sb2FkID0gbnZfZHJtX2xvYWQsCiAgICAgLnVu
    11. bG9hZCA9IG52X2RybV91bmxvYWQsCiAgICAgLmZvcHMgPSAmbnZfZHJtX2Zv
    12. cHMsCg==
    13. ====" | 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:

    Quellcode

    1. md5sum nvidia-340.101-4.9.diff
    2. 8f85a6a498d5ca091640efc18549c1c3 nvidia-340.101-4.9.diff


    4) Patch auf Installeranwenden

    Quellcode

    1. bash ./NVIDIA-Linux-x86_64-340.101-no-compat32.run --apply-patch nvidia-340.101-4.9.diff
    2. Verifying archive integrity... OK
    3. Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 340.101........
    4. ----snip ----
    5. 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
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K

    Rain_Maker schrieb:

    Schlussfolgerung, der letzte Teil des Patches wird auch für den 340.101 benötigt, damit er unter 4.9 überhaupt läuft.


    devtalk.nvidia.com/default/top…4-using-linux-kernel-4-9/

    Man beachte Post #4, das bestätigt dann wohl meine Annahme.

    Greetz,

    RM
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE Leap 42.3 - Kernel 4.14.x - fluxbox 1.3.7

    Bitmessage: BM-2D8h8QZmvHfgbixWeiG1NDZHG1iXAhBz8K