| diff --git a/kernel-module-source/kernel-open/conftest.sh b/kernel-module-source/kernel-open/conftest.sh |
| index 4e3e759..bd86206 100755 |
| --- a/kernel-module-source/kernel-open/conftest.sh |
| +++ b/kernel-module-source/kernel-open/conftest.sh |
| @@ -5107,22 +5107,23 @@ compile_test() { |
| 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 --git a/kernel-module-source/kernel-open/nvidia/nvidia.Kbuild b/kernel-module-source/kernel-open/nvidia/nvidia.Kbuild |
| index e868c6c..b18f824 100644 |
| --- a/kernel-module-source/kernel-open/nvidia/nvidia.Kbuild |
| +++ b/kernel-module-source/kernel-open/nvidia/nvidia.Kbuild |
| @@ -161,7 +161,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += pci_enable_atomic_ops_to_root |
| 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 |
| @@ -226,6 +226,7 @@ NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_tsec_comms_alloc_me |
| NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_tsec_comms_free_gscco_mem |
| NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_memory_block_size_bytes |
| NV_CONFTEST_SYMBOL_COMPILE_TESTS += crypto |
| +NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_follow_pte |
| |
| NV_CONFTEST_TYPE_COMPILE_TESTS += dma_ops |
| NV_CONFTEST_TYPE_COMPILE_TESTS += swiotlb_dma_ops |
| diff --git a/kernel-module-source/kernel-open/nvidia/os-mlock.c b/kernel-module-source/kernel-open/nvidia/os-mlock.c |
| index e378245..fe9f1b3 100644 |
| --- a/kernel-module-source/kernel-open/nvidia/os-mlock.c |
| +++ b/kernel-module-source/kernel-open/nvidia/os-mlock.c |
| @@ -30,10 +30,28 @@ static inline int nv_follow_pfn(struct vm_area_struct *vma, |
| 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_PRESENT_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_PRESENT_follow_pte |
| + return -1; |
| +#endif // NV_IS_EXPORT_SYMBOL_PRESENT_follow_pte |
| #endif |
| } |
| |