this is the proposed patch, it was extracted and adapted from upstream
open source kernel module at
this commit:

https://github.com/NVIDIA/open-gpu-kernel-modules/commit/74ee05e16071354faaaaa68b25461c5a62529dc1

tested with 6.10.3 using nvidia 535.183.01

perhaps follow_pte was already gpl only in 6.9.12 but still compiles
for some reason

the currently implementation of nv_follow_pfn() returns -1, but the
same is for new nvidia version
diff -ur nvidia-current-535.183.01.orig/conftest.sh nvidia-current-535.183.01/conftest.sh
--- nvidia-current-535.183.01.orig/conftest.sh	2024-06-14 11:20:01.000000000 +0200
+++ nvidia-current-535.183.01/conftest.sh	2024-08-07 12:50:57.923895110 +0200
@@ -5181,22 +5181,23 @@
             compile_check_conftest "$CODE" "NV_PCI_CLASS_MULTIMEDIA_HD_AUDIO_PRESENT" "" "generic"
         ;;
 
-        unsafe_follow_pfn)
+        follow_pfn)
             #
-            # Determine if unsafe_follow_pfn() is present.
+            # Determine if follow_pfn() is present.
             #
-            # unsafe_follow_pfn() was added by commit 69bacee7f9ad
-            # ("mm: Add unsafe_follow_pfn") in v5.13-rc1.
+            # follow_pfn() was added by commit 3b6748e2dd69
+            # ("mm: introduce follow_pfn()") in v2.6.31-rc1, and removed
+            # by commit 233eb0bf3b94 ("mm: remove follow_pfn")
+            # from linux-next 233eb0bf3b94.
             #
             CODE="
             #include <linux/mm.h>
-            void conftest_unsafe_follow_pfn(void) {
-                unsafe_follow_pfn();
+            void conftest_follow_pfn(void) {
+                follow_pfn();
             }"
 
-            compile_check_conftest "$CODE" "NV_UNSAFE_FOLLOW_PFN_PRESENT" "" "functions"
+            compile_check_conftest "$CODE" "NV_FOLLOW_PFN_PRESENT" "" "functions"
         ;;
-
         drm_plane_atomic_check_has_atomic_state_arg)
             #
             # Determine if drm_plane_helper_funcs::atomic_check takes 'state'
diff -ur nvidia-current-535.183.01.orig/nvidia/nvidia.Kbuild nvidia-current-535.183.01/nvidia/nvidia.Kbuild
--- nvidia-current-535.183.01.orig/nvidia/nvidia.Kbuild	2024-06-14 11:20:01.000000000 +0200
+++ nvidia-current-535.183.01/nvidia/nvidia.Kbuild	2024-08-07 12:58:41.718220280 +0200
@@ -161,7 +161,7 @@
 NV_CONFTEST_FUNCTION_COMPILE_TESTS += vga_tryget
 NV_CONFTEST_FUNCTION_COMPILE_TESTS += cc_platform_has
 NV_CONFTEST_FUNCTION_COMPILE_TESTS += seq_read_iter
-NV_CONFTEST_FUNCTION_COMPILE_TESTS += unsafe_follow_pfn
+NV_CONFTEST_FUNCTION_COMPILE_TESTS += follow_pfn
 NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_get
 NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_put_unlocked
 NV_CONFTEST_FUNCTION_COMPILE_TESTS += add_memory_driver_managed
@@ -199,6 +199,7 @@
 
 NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_gpl_of_node_to_nid
 NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_gpl_sme_active
+NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_gpl_follow_pte
 NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_swiotlb_map_sg_attrs
 NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_swiotlb_dma_ops
 NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present___close_fd
diff -ur nvidia-current-535.183.01.orig/nvidia/os-mlock.c nvidia-current-535.183.01/nvidia/os-mlock.c
--- nvidia-current-535.183.01.orig/nvidia/os-mlock.c	2024-05-12 22:26:49.000000000 +0200
+++ nvidia-current-535.183.01/nvidia/os-mlock.c	2024-08-07 13:18:21.734359573 +0200
@@ -36,10 +36,28 @@
                                 unsigned long address,
                                 unsigned long *pfn)
 {
-#if defined(NV_UNSAFE_FOLLOW_PFN_PRESENT)
-    return unsafe_follow_pfn(vma, address, pfn);
-#else
+#if defined(NV_FOLLOW_PFN_PRESENT)
     return follow_pfn(vma, address, pfn);
+#else
+#if !NV_IS_EXPORT_SYMBOL_GPL_follow_pte
+    int status = 0;
+    spinlock_t *ptl;
+    pte_t *ptep;
+
+    if (!(vma->vm_flags & (VM_IO | VM_PFNMAP)))
+        return status;
+
+    status = follow_pte(vma, address, &ptep, &ptl);
+    if (status)
+        return status;
+    *pfn = pte_pfn(ptep_get(ptep));
+
+    // The lock is acquired inside follow_pte()
+    pte_unmap_unlock(ptep, ptl);
+    return 0;
+#else // NV_IS_EXPORT_SYMBOL_GPL_follow_pte
+    return -1;
+#endif // NV_IS_EXPORT_SYMBOL_GPL_follow_pte
 #endif
 }
 

Reply via email to