diff --git a/PKGBUILD b/PKGBUILD index f8ccb3e..d59f969 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -303,7 +303,7 @@ fi pkgname=("${_pkgname_array[@]}") pkgver=$_driver_version -pkgrel=252 +pkgrel=253 arch=('x86_64') url="http://www.nvidia.com/" license=('custom:NVIDIA') @@ -374,6 +374,7 @@ source=($_source_name 'legacy-kernel-6.5.diff' 'kernel-6.5.patch' 'legacy-kernel-6.6.diff' + '6.1-6-7-8-gpl.diff' ) msg2 "Selected driver integrity check behavior (md5sum or SKIP): $_md5sum" # If the driver is "known", return md5sum. If it isn't, return SKIP @@ -423,7 +424,8 @@ md5sums=("$_md5sum" '4f855bb0e0b84e8e5d072c687256767a' '50d3eac54d14d44d70df92770a3a9abf' 'b81cac7573842ebd7af30fdf851c63f9' - 'd11cb3bd76ab61a0f086aea9a0c53087') + 'd11cb3bd76ab61a0f086aea9a0c53087' + 'f7f95287eb18be63bfad0427f13b6d43') if [ "$_open_source_modules" = "true" ]; then if [[ "$_srcbase" == "NVIDIA-kernel-module-source" ]]; then @@ -844,6 +846,7 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf cd .. fi fi + # 6.5 if (( $(vercmp "$_kernel" "6.5") >= 0 )); then _kernel65="1" @@ -855,14 +858,22 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf cd .. fi fi + # 6.6 if (( $(vercmp "$_kernel" "6.6") >= 0 )); then _kernel66="1" _whitelist66=() if [[ $pkgver = 470.199* ]]; then + cd .. + fi + fi + + # 6.1-6-7-8 GPL + if (( $(vercmp "$_kernel" "6.1") >= 0 )) || (( $(vercmp "$_kernel" "6.6") >= 0 )) || (( $(vercmp "$_kernel" "6.7") >= 0 )) || (( $(vercmp "$_kernel" "6.8") >= 0 )); then + if [[ $pkgver = 470.* ]] || [[ $pkgver = 535.* ]] || [[ $pkgver = 545.* ]] || [[ $pkgver = 550.* ]]; then cd "$srcdir"/"$_pkg"/kernel-$_kernel - msg2 "Applying legacy-kernel-6.6.patch for $_kernel..." - patch -Np2 -i "$srcdir"/legacy-kernel-6.6.diff + msg2 "Applying 6.1-6-7-8-gpl.diff for $_kernel..." + patch -Np2 -i "$srcdir"/6.1-6-7-8-gpl.diff cd .. fi fi @@ -1343,6 +1354,7 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf patch -Np1 -i "$srcdir"/legacy-kernel-6.4.diff fi fi + # 6.5 if [ "$_kernel65" = "1" ]; then patchy=0 @@ -1360,6 +1372,7 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf patch -Np1 -i "$srcdir"/legacy-kernel-6.5.diff fi fi + # 6.6 if [ "$_kernel66" = "1" ]; then patchy=0 @@ -1374,6 +1387,16 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf patch -Np1 -i "$srcdir"/legacy-kernel-6.6.diff fi fi + + # 6.1-6-7-8 GPL + if (( $(vercmp "$_kernel" "6.1") >= 0 )) || (( $(vercmp "$_kernel" "6.6") >= 0 )) || (( $(vercmp "$_kernel" "6.7") >= 0 )) || (( $(vercmp "$_kernel" "6.8") >= 0 )); then + if [[ $pkgver = 470.* ]] || [[ $pkgver = 535.* ]] || [[ $pkgver = 545.* ]] || [[ $pkgver = 550.* ]]; then + msg2 "Applying 6.1-6-7-8-gpl.diff for dkms..." + patch -Np1 -i "$srcdir"/6.1-6-7-8-gpl.diff + cd .. + fi + fi + # Legacy quirks if [ "$_oldstuff" = "1" ]; then msg2 "Applying 01-ipmi-vm.diff for dkms..." diff --git a/patches/6.1-6-7-8-gpl.diff b/patches/6.1-6-7-8-gpl.diff new file mode 100644 index 0000000..09a6ce3 --- /dev/null +++ b/patches/6.1-6-7-8-gpl.diff @@ -0,0 +1,62 @@ +linux-6.1.76, 6.6.15, and 6.7.3 have modified the non-ARCH-specific +pfn_valid() to use __rcu_read_lock/unlock[1] that is marked GPL and +cannot be used here[2][3][4] unless use the open source variant. + +As a workaround, reuse the old implementation until NVIDIA makes +a fixed release (due to no longer be using pfn_valid[5], likely +with its own implementation similarly to this patch). + +Safe to use with kernel >=5.15 or so but older ones had a different +pfn_valid implementation. However 5.15 and older branches are +"currently" not affected, so simply limit to >=6.1.76. + +[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/include/linux/mmzone.h?h=v6.7.3&id=3a01daace71b521563c38bbbf874e14c3e58adb7 +[2] https://bugs.gentoo.org/923456 +[3] https://forums.developer.nvidia.com/t/280908 +[4] https://github.com/NVIDIA/open-gpu-kernel-modules/issues/594 +[5] https://github.com/NVIDIA/open-gpu-kernel-modules/issues/594#issuecomment-1916197641 +--- a/kernel-dkms/common/inc/nv-linux.h ++++ b/kernel-dkms/common/inc/nv-linux.h +@@ -1990,2 +1990,23 @@ + ++#if defined(CONFIG_HAVE_ARCH_PFN_VALID) || LINUX_VERSION_CODE < KERNEL_VERSION(6,1,76) ++# define nv_pfn_valid pfn_valid ++#else ++/* pre-6.1.76 kernel pfn_valid version without GPL rcu_read_lock/unlock() */ ++static inline int nv_pfn_valid(unsigned long pfn) ++{ ++ struct mem_section *ms; ++ ++ if (PHYS_PFN(PFN_PHYS(pfn)) != pfn) ++ return 0; ++ ++ if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) ++ return 0; ++ ++ ms = __pfn_to_section(pfn); ++ if (!valid_section(ms)) ++ return 0; ++ ++ return early_section(ms) || pfn_section_valid(ms, pfn); ++} ++#endif + #endif /* _NV_LINUX_H_ */ +--- a/kernel-dkms/nvidia/nv-mmap.c ++++ b/kernel-dkms/nvidia/nv-mmap.c +@@ -576,3 +576,3 @@ + if (!IS_REG_OFFSET(nv, access_start, access_len) && +- (pfn_valid(PFN_DOWN(mmap_start)))) ++ (nv_pfn_valid(PFN_DOWN(mmap_start)))) + { +--- a/kernel-dkms/nvidia/os-mlock.c ++++ b/kernel-dkms/nvidia/os-mlock.c +@@ -102,3 +102,3 @@ + if ((nv_follow_pfn(vma, (start + (i * PAGE_SIZE)), &pfn) < 0) || +- (!pfn_valid(pfn))) ++ (!nv_pfn_valid(pfn))) + { +@@ -176,3 +176,3 @@ + +- if (pfn_valid(pfn)) ++ if (nv_pfn_valid(pfn)) + {