Warnung
Der Patch in dieser Frage bezieht sich auf Kernel 3.4, ebenso wie der folgende. Ein in Echtzeit gepatchter Kernel 3.4 ist erforderlich.
Der neue nvidia 302-Treiber benötigt das von xorg-server 1.12 bereitgestellte Video-ABI, und Precise wird leider mit xorg-server 1.11 geliefert. Die folgenden Anweisungen beinhalten das Hinzufügen der xorg-edgers PPA als Softwarequelle zur Bereitstellung von xorg-server 1.12. Dies birgt ein gewisses Bruchrisiko. Die Anweisungen zur Deinstallation befinden sich unten, aber lesen Sie sie dort durch, um mögliche Probleme zu erkennen.
Anleitung
Ändern des gepackten NVIDIA-Treibers
Erstellen Sie ein temporäres Verzeichnis und wechseln Sie in dieses Verzeichnis mit:
mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
Laden Sie die Datei nvidia-current_302 * .deb von der xorg-edgers-PPA herunter, indem Sie die Pakete für Precise unter nvidia-graphics-driver_302 * hier durchsuchen . Zum Zeitpunkt dieses Schreibens kann ein direkter Download durchgeführt werden mit:
wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_amd64.deb
Extrahieren Sie die .deb mit:
dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
Fügen Sie den Patch dem deb_contents/usr/src/nvidia-current*/patches
Verzeichnis hinzu, indem Sie Folgendes in ein Terminal einfügen:
d=$(echo deb_contents/usr/src/nvidia-current*/patches) ; cat > $d/buildfix_kernel_rt_3.4.patch <<'EOF'
diff -u a/conftest.sh b/conftest.sh
--- a/conftest.sh 2012-05-03 09:49:19.582854050 +0100
+++ b/conftest.sh 2012-05-03 09:52:58.524101586 +0100
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -965,11 +965,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +981,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1604,6 +1606,9 @@
fi
fi
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
+
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
exit 0
diff -u a/nv-linux.h b/nv-linux.h
--- a/nv-linux.h 2012-05-03 09:49:19.622853547 +0100
+++ b/nv-linux.h 2012-05-03 09:56:12.045668690 +0100
@@ -291,7 +291,18 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
+#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
+#elif defined(CONFIG_PREEMPT_RT)
typedef atomic_spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
@@ -954,7 +965,9 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
+#elif defined(CONFIG_PREEMPT_RT)
#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
EOF
Fügen Sie den Patch zu dkms.conf hinzu, indem Sie ihn in ein Terminal einfügen:
d=$(echo deb_contents/usr/src/nvidia-current*) ; cat >> $d/dkms.conf <<'EOF'
PATCH_MATCH[1]="^3\.4.*(rt|realtime)"
PATCH[1]="buildfix_kernel_rt_3.4.patch"
EOF
Ändern Sie die Versionsnummer in deb_contents / DEBIAN / control, indem Sie Folgendes ausgeben:
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
Packen Sie den Treiber neu ein mit:
dpkg -b deb_contents nvidia-current_$(sed -n 's/^\(Version: *\)//p' deb_contents/DEBIAN/control)_amd64.deb
Installieren der PPA und des geänderten Treibers
Fügen Sie die xorg-edgers PPA hinzu:
sudo add-apt-repository ppa:xorg-edgers/ppa && sudo apt-get update && sudo apt-get dist-upgrade
Installieren Sie die lokal geänderte .deb mit:
sudo dpkg -i nvidia-current_*+rtfix_*.deb
Auf dem Laufenden gehalten werden
Die xorg-edgers PPA wird mit neueren Versionen des nvidia-Treibers aktualisiert, sobald sie herauskommen. Sie müssen die obigen Anweisungen zum erneuten Verpacken bei jeder neuen Version wiederholen.
Deinstallation
Sie sollten in der Lage sein, wie nouveau
folgt zum Treiber zurückzukehren:
sudo apt-get remove nvidia-current
sudo apt-get install ppa-purge
sudo ppa-purge ppa:xorg-edgers/ppa
In meinem Fall umfasste dieser Prozess die Deinstallation wine
zusammen mit einigen i386-Paketen (die stattdessen herabgestuft werden sollten). Seien Sie vorsichtig, ppa-purge
wenn Sie auf amd64 sind, da es mit Multiarch nicht gut zurechtkommt (wie in den PPA-Warnungen angegeben). In meinem Fall war das Ergebnis kein Problem (ich habe es einfach neu installiert wine
), aber andere Benutzer haben möglicherweise stark unterbrochene Abhängigkeiten, je nachdem, was sie installiert haben.