| linux-5.15.149 [1] has modified the non-ARCH-specific pfn_valid() to use |
| __rcu_read_lock/unlock[1] that is marked GPL and cannot be used non open source |
| nvidia gpu driver builds. |
| |
| As a workaround, reuse the old implementation of pfn_valid. |
| |
| [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/include/linux/mmzone.h?h=v5.15.149&id=b448de2459b6d62a53892487ab18b7d823ff0529 |
| diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h |
| index f8df9e3..a5c8634 100644 |
| --- kernel/common/inc/nv-linux.h |
| +++ kernel/common/inc/nv-linux.h |
| @@ -1990,2 +1990,23 @@ |
| |
| +#if defined(CONFIG_HAVE_ARCH_PFN_VALID) || LINUX_VERSION_CODE < KERNEL_VERSION(5,15,149) |
| +# define nv_pfn_valid pfn_valid |
| +#else |
| +/* pre-5.15.149 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_ */ |
| diff --git a/kernel/nvidia/nv-mmap.c b/kernel/nvidia/nv-mmap.c |
| index 5926d3c..d2052c4 100644 |
| --- kernel/nvidia/nv-mmap.c |
| +++ kernel/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)))) |
| { |
| diff --git a/kernel/nvidia/os-mlock.c b/kernel/nvidia/os-mlock.c |
| index c97ef4c..44e37c2 100644 |
| --- kernel/nvidia/os-mlock.c |
| +++ kernel/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)) |
| { |