--- NVIDIA-Linux-x86_64-390.87-no-compat32/kernel/conftest.sh~ 2018-08-22 06:47:57.000000000 +0900 +++ NVIDIA-Linux-x86_64-390.87-no-compat32/kernel/conftest.sh 2018-12-29 09:33:30.537541114 +0900 @@ -2725,6 +2725,32 @@ return fi + # Conftest #3: Check if get_user_pages has gup_flags instead of write and force parameters. + # Return if available. + # Fall through to default case if absent. + + echo "$CONFTEST_PREAMBLE + #include + long get_user_pages(struct task_struct *tsk, + struct mm_struct *mm, + unsigned long start, + unsigned long nr_pages, + unsigned int gup_flags, + struct page **pages, + struct vm_area_struct **vmas) { + return 0; + }" > conftest$$.c + + $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 + rm -f conftest$$.c + + if [ -f conftest$$.o ]; then + echo "#undef NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" + echo "#define NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions" + rm -f conftest$$.o + return + fi + echo "#define NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" echo "#define NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions" --- NVIDIA-Linux-x86_64-390.87-no-compat32/kernel/common/inc/nv-mm.h~ 2018-08-22 09:55:23.000000000 +0900 +++ NVIDIA-Linux-x86_64-390.87-no-compat32/kernel/common/inc/nv-mm.h 2018-12-29 09:30:55.797962776 +0900 @@ -40,8 +40,31 @@ */ #if defined(NV_GET_USER_PAGES_HAS_TASK_STRUCT) + #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \ get_user_pages(current, current->mm, start, nr_pages, write, force, pages, vmas) + #else + #include + #include + #include + + static inline long NV_GET_USER_PAGES(unsigned long start, + unsigned long nr_pages, + int write, + int force, + struct page **pages, + struct vm_area_struct **vmas) + { + unsigned int flags = 0; + + if (write) + flags |= FOLL_WRITE; + if (force) + flags |= FOLL_FORCE; + + return get_user_pages(current, current->mm, start, nr_pages, flags, pages, vmas); + } + #endif #else #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) #define NV_GET_USER_PAGES get_user_pages @@ -147,7 +147,32 @@ } #endif #else - #define NV_GET_USER_PAGES_REMOTE get_user_pages + #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) + #define NV_GET_USER_PAGES_REMOTE get_user_pages + #else + #include + #include + #include + + static inline long NV_GET_USER_PAGES_REMOTE(struct task_struct *tsk, + struct mm_struct *mm, + unsigned long start, + unsigned long nr_pages, + int write, + int force, + struct page **pages, + struct vm_area_struct **vmas) + { + unsigned int flags = 0; + + if (write) + flags |= FOLL_WRITE; + if (force) + flags |= FOLL_FORCE; + + return get_user_pages(tsk, mm, start, nr_pages, flags, pages, vmas); + } + #endif #endif