The Closed-Source NVIDIA Linux Driver Is Incompatible With Linux 5.9 And Support Won't Come Until Mid-November
The latest Nvidia graphics driver for Linux, v455.28, won't work with the latest Linux kernel. This may be due to an intentional change on the Linux kernel side that blocks third party shims from using GPL-only symbols. Regardless of the root cause, anyone using Nvidia on Linux should stick with Linux 5.8 for now. Nvidia has promised that an updated driver compatible with Linux 5.9 will arrive mid-November.
Nvidia is the only PC graphics vendor that does not offer any free software graphics drivers for GNU/Linux users. There is a independently created free software driver called Nouveau available but it is, in practice, absolute garbage. The driver itself isn't garbage, but the lack of any usable firmware with basic features like clocking and power management makes it a dismal experience. Those who want to use Nvidia hardware on Linux are in practice forced to use Nvidia's binary blob driver.
Using the closed-source proprietary software driver from Nvidia used to be a total nightmare on Linux. It would only work with Xorg version X and kernel version Y and if you were screwed if you upgraded either of those. That's been less of a problem in recent years. now we're once again back to Nvidia's driver dictating what kernel versions those who own their hardware can and can't use.
Nvidia story regarding their drivers incompatibility with Linux 5.9 as shared in an "advisory" in their forum is:
"Due to an incompatibility issue, we advise customers to defer updating to Linux Kernel 5.9+ until mid-November when an NVIDIA Linux GPU driver update with Kernel 5.9+ support is expected to be available."
An advisory from something called "Arch" says that the Nvidia driver will partially work with Linux 5.9. Their advisory says that basic graphics will work while more advanced features like OpenCL and CUDA are broken:
"nvidia is currently partially incompatible with linux >= 5.9. While graphics should work fine, CUDA, OpenCL, and likely other features are broken. Users who've already upgraded and need those features are advised to switch to the linux-lts kernel for the time being until a fix for nvidia is available."
The reason the Nvidia driver won't work with Linux 5.9 may be due to an intentional kernel-side change made with the explicit purpose of preventing non-GPL binary blob drivers from using GPL symbols. Using non-GPL code with GPL symbols has always been against the rules. Those rules were, prior to Linux 5.9, not really enforced. Most proprietary drivers got around that rule by putting a "shim" between the kernel and the driver. OpenSUSE's kernel developer Jessica Yu got Linus Torvalds to merge a patch by Christoph Hellwig which prevents that:
"Summary of modules changes for the 5.9 merge window:
- Have modules that use symbols from proprietary modules inherit the TAINT_PROPRIETARY_MODULE taint, in an effort to prevent GPL shim modules that are used to circumvent _GPL exports. These are modules that claim to be GPL licensed while also using symbols from proprietary modules. Such modules will be rejected while non-GPL modules will inherit the proprietary taint.
- Module export space cleanup. Unexport symbols that are unused outside of module.c or otherwise used in only built-in code."
It's hard to say if these changes are good or bad. They are great from a moral and ethical perspective. They are not that great for a end-user perspective since it makes it harder to use binary blob drivers with Linux 5.9+. Nvidia expects to have an updated Linux driver available in the middle of November, so this change is apparently not something that makes it impossible to use their driver with future Linux kernels.
Current, and historical, Nvidia drivers are available at download.nvidia.com/XFree86/Linux-x86_64/. We advice that you bookmark that location as it's a ftp-style list of folders that are named by version. It's much easier to navigate than Nvidia's main website and it will typically work when Nvidia's main website is down or overloaded.