From 7ec55137a56bf7205055b439647a6d2f1194c375 Mon Sep 17 00:00:00 2001 From: Andrew Benson Date: Wed, 13 Sep 2023 20:01:36 -0500 Subject: [PATCH] nvidia390: patch for linux 6.4/6.5 --- srcpkgs/nvidia390/files/linux-6.4.patch | 17 + srcpkgs/nvidia390/files/linux-6.5-x64.patch | 366 ++++++++++++++++++++ srcpkgs/nvidia390/files/linux-6.5-x86.patch | 327 +++++++++++++++++ srcpkgs/nvidia390/template | 5 +- 4 files changed, 714 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/nvidia390/files/linux-6.4.patch create mode 100644 srcpkgs/nvidia390/files/linux-6.5-x64.patch create mode 100644 srcpkgs/nvidia390/files/linux-6.5-x86.patch diff --git a/srcpkgs/nvidia390/files/linux-6.4.patch b/srcpkgs/nvidia390/files/linux-6.4.patch new file mode 100644 index 0000000000000..3796c83ce4927 --- /dev/null +++ b/srcpkgs/nvidia390/files/linux-6.4.patch @@ -0,0 +1,17 @@ +diff --git a/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c +index 8ef4c27..85c43f2 100644 +--- a/nvidia-drm/nvidia-drm-drv.c ++++ b/nvidia-drm/nvidia-drm-drv.c +@@ -762,8 +766,11 @@ static void nv_drm_update_drm_driver_fea + + nv_drm_driver.dumb_create = nv_drm_dumb_create; + nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset; ++// Rel. commit "drm: remove dumb_destroy callback" (Christian König, 26 Jan 2023) ++// NB: No resources are leaked, the kernel releases the same resources by default ++#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0) + nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy; +- ++#endif + #if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS) + nv_drm_driver.gem_vm_ops = &nv_drm_gem_vma_ops; + #endif diff --git a/srcpkgs/nvidia390/files/linux-6.5-x64.patch b/srcpkgs/nvidia390/files/linux-6.5-x64.patch new file mode 100644 index 0000000000000..25860157e4de6 --- /dev/null +++ b/srcpkgs/nvidia390/files/linux-6.5-x64.patch @@ -0,0 +1,366 @@ +diff --ignore-space-change --unified --recursive --no-dereference a/common/inc/nv-mm.h b/common/inc/nv-mm.h +--- a/common/inc/nv-mm.h 2022-10-12 06:30:26.000000000 -0300 ++++ b/common/inc/nv-mm.h 2023-09-02 15:39:35.376520074 -0300 +@@ -77,71 +77,14 @@ + #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) + #define NV_GET_USER_PAGES get_user_pages + #else ++ #if defined(NV_GET_USER_PAGES_DROPPED_VMA) + #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(start, nr_pages, flags, pages, vmas); +- } +- #endif +-#endif +- +-/* +- * get_user_pages_remote() was added by commit 1e9877902dc7 +- * ("mm/gup: Introduce get_user_pages_remote()") in v4.6 (2016-02-12). +- * +- * The very next commit cde70140fed8 ("mm/gup: Overload get_user_pages() +- * functions") deprecated the 8-argument version of get_user_pages for the +- * non-remote case (calling get_user_pages with current and current->mm). +- * +- * The guidelines are: call NV_GET_USER_PAGES_REMOTE if you need the 8-argument +- * version that uses something other than current and current->mm. Use +- * NV_GET_USER_PAGES if you are refering to current and current->mm. +- * +- * Note that get_user_pages_remote() requires the caller to hold a reference on +- * the task_struct (if non-NULL and if this API has tsk argument) and the mm_struct. +- * This will always be true when using current and current->mm. If the kernel passes +- * the driver a vma via driver callback, the kernel holds a reference on vma->vm_mm +- * over that callback. +- * +- * get_user_pages_remote() write/force parameters were replaced +- * with gup_flags by commit 9beae1ea8930 ("mm: replace get_user_pages_remote() +- * write/force parameters with gup_flags") in v4.9 (2016-10-13). +- * +- * get_user_pages_remote() added 'locked' parameter by commit 5b56d49fc31d +- * ("mm: add locked parameter to get_user_pages_remote()") in +- * v4.10 (2016-12-14). +- * +- * get_user_pages_remote() removed 'tsk' parameter by +- * commit 64019a2e467a ("mm/gup: remove task_struct pointer for +- * all gup code") in v5.9-rc1 (2020-08-11). +- * +- */ +- +-#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT) +- #if defined(NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS) +- #define NV_GET_USER_PAGES_REMOTE get_user_pages_remote +- #else +- 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) ++ struct page **pages) + { + unsigned int flags = 0; + +@@ -150,34 +93,12 @@ + if (force) + flags |= FOLL_FORCE; + +- #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG) +- #if defined (NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG) +- return get_user_pages_remote(tsk, mm, start, nr_pages, flags, +- pages, vmas, NULL); +- #else +- return get_user_pages_remote(mm, start, nr_pages, flags, +- pages, vmas, NULL); +- #endif +- +- #else +- +- return get_user_pages_remote(tsk, mm, start, nr_pages, flags, +- pages, vmas); +- +- #endif +- ++ return get_user_pages(start, nr_pages, flags, pages); + } +- #endif +-#else +- #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) +- #define NV_GET_USER_PAGES_REMOTE NV_GET_USER_PAGES + #else + #include +- #include + +- static inline long NV_GET_USER_PAGES_REMOTE(struct task_struct *tsk, +- struct mm_struct *mm, +- unsigned long start, ++ static inline long NV_GET_USER_PAGES(unsigned long start, + unsigned long nr_pages, + int write, + int force, +@@ -191,12 +112,12 @@ + if (force) + flags |= FOLL_FORCE; + +- return get_user_pages(tsk, mm, start, nr_pages, flags, pages, vmas); ++ return get_user_pages(start, nr_pages, flags, pages, vmas); + } + #endif ++ #endif + #endif + +- + /* + * The .virtual_address field was effectively renamed to .address, by these + * two commits: +diff --ignore-space-change --unified --recursive --no-dereference a/conftest.sh b/conftest.sh +--- a/conftest.sh 2022-10-11 13:00:50.000000000 -0300 ++++ b/conftest.sh 2023-09-02 15:40:49.460261403 -0300 +@@ -3051,7 +3051,6 @@ + # write and force parameters AND that gup has task_struct and + # mm_struct as its first arguments. + # Return if available. +- # Fall through to default case if absent. + + echo "$CONFTEST_PREAMBLE + #include +@@ -3075,99 +3074,16 @@ + 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" +- +- return +- ;; +- +- get_user_pages_remote) +- # +- # Determine if the function get_user_pages_remote() is +- # present and has write/force/locked/tsk parameters. +- # +- # get_user_pages_remote() was added by: +- # 2016 Feb 12: 1e9877902dc7e11d2be038371c6fbf2dfcd469d7 +- # +- # get_user_pages[_remote]() write/force parameters +- # replaced with gup_flags: +- # 2016 Oct 12: 768ae309a96103ed02eb1e111e838c87854d8b51 +- # 2016 Oct 12: 9beae1ea89305a9667ceaab6d0bf46a045ad71e7 +- # +- # get_user_pages_remote() added 'locked' parameter +- # 2016 Dec 14:5b56d49fc31dbb0487e14ead790fc81ca9fb2c99 +- # +- # get_user_pages_remote() removed 'tsk' parameter by +- # commit 64019a2e467a ("mm/gup: remove task_struct pointer for +- # all gup code") in v5.9-rc1 (2020-08-11). +- # +- # conftest #1: check if get_user_pages_remote() is available +- # return if not available. +- # Fall through to conftest #2 if it is present +- +- echo "$CONFTEST_PREAMBLE +- #include +- void conftest_get_user_pages_remote(void) { +- get_user_pages_remote(); +- }" > 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_REMOTE_PRESENT" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- rm -f conftest$$.o +- return +- fi +- +- # conftest #2: check if get_user_pages_remote() has write and +- # force arguments. Return if these arguments are present +- # Fall through to conftest #3 if these args are absent. +- echo "#define NV_GET_USER_PAGES_REMOTE_PRESENT" | append_conftest "functions" +- echo "$CONFTEST_PREAMBLE +- #include +- long 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) { +- return 0; +- }" > conftest$$.c +- +- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 +- rm -f conftest$$.c +- +- if [ -f conftest$$.o ]; then +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- rm -f conftest$$.o +- return +- fi +- +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" ++ # Conftest #4: check if vma arg was dropped ++ # Return if available. ++ # Fall through to default case if absent. + +- # +- # conftest #3: check if get_user_pages_remote() has locked argument +- # Return if these arguments are present. Fall through to conftest #4 +- # if these args are absent. +- # + echo "$CONFTEST_PREAMBLE + #include +- long get_user_pages_remote(struct task_struct *tsk, +- struct mm_struct *mm, +- unsigned long start, ++ long get_user_pages(unsigned long start, + unsigned long nr_pages, + unsigned int gup_flags, +- struct page **pages, +- struct vm_area_struct **vmas, +- int *locked) { ++ struct page **pages) { + return 0; + }" > conftest$$.c + +@@ -3175,40 +3091,17 @@ + rm -f conftest$$.c + + if [ -f conftest$$.o ]; then +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" ++ echo "#define NV_GET_USER_PAGES_DROPPED_VMA" | append_conftest "functions" ++ echo "#undef NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" ++ echo "#undef NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions" + rm -f conftest$$.o + return + fi + +- # +- # conftest #4: check if get_user_pages_remote() does not take +- # tsk argument. +- # +- echo "$CONFTEST_PREAMBLE +- #include +- long get_user_pages_remote(struct mm_struct *mm, +- unsigned long start, +- unsigned long nr_pages, +- unsigned int gup_flags, +- struct page **pages, +- struct vm_area_struct **vmas, +- int *locked) { +- 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_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- rm -f conftest$$.o +- else ++ 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" + +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- fi ++ return + ;; + + usleep_range) +diff --ignore-space-change --unified --recursive --no-dereference a/nvidia/os-mlock.c b/nvidia/os-mlock.c +--- a/nvidia/os-mlock.c 2022-10-12 06:30:26.000000000 -0300 ++++ b/nvidia/os-mlock.c 2023-09-02 15:46:43.108702285 -0300 +@@ -127,8 +127,13 @@ + } + + nv_mmap_read_lock(mm); ++#if defined(NV_GET_USER_PAGES_DROPPED_VMA) ++ ret = NV_GET_USER_PAGES((unsigned long)address, ++ page_count, write, force, user_pages); ++#else + ret = NV_GET_USER_PAGES((unsigned long)address, + page_count, write, force, user_pages, NULL); ++#endif + nv_mmap_read_unlock(mm); + pinned = ret; + +diff --ignore-space-change --unified --recursive --no-dereference a/nvidia-drm/nvidia-drm-linux.c b/nvidia-drm/nvidia-drm-linux.c +--- a/nvidia-drm/nvidia-drm-linux.c 2022-10-12 06:30:31.000000000 -0300 ++++ b/nvidia-drm/nvidia-drm-linux.c 2023-09-02 15:44:37.601432752 -0300 +@@ -114,9 +114,13 @@ + } + + nv_mmap_read_lock(mm); +- ++#if defined(NV_GET_USER_PAGES_DROPPED_VMA) ++ pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force, ++ user_pages); ++#else + pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force, + user_pages, NULL); ++#endif + nv_mmap_read_unlock(mm); + + if (pages_pinned < 0 || (unsigned)pages_pinned < pages_count) { +diff --ignore-space-change --unified --recursive --no-dereference a/nvidia-uvm/uvm8_tools.c b/nvidia-uvm/uvm8_tools.c +--- a/nvidia-uvm/uvm8_tools.c 2022-10-12 06:30:28.000000000 -0300 ++++ b/nvidia-uvm/uvm8_tools.c 2023-09-02 15:45:13.038272134 -0300 +@@ -251,13 +251,35 @@ + } + + nv_mmap_read_lock(current->mm); ++#if defined(NV_GET_USER_PAGES_DROPPED_VMA) ++ ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages); ++#else + ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages, vmas); ++#endif + nv_mmap_read_unlock(current->mm); + if (ret != num_pages) { + status = NV_ERR_INVALID_ARGUMENT; + goto fail; + } ++#if defined(NV_GET_USER_PAGES_DROPPED_VMA) ++ struct vm_area_struct *vma; ++ unsigned long start; + ++ nv_mmap_read_lock(current->mm); ++ start = user_va; ++ for (i = 0; i < num_pages; i++) { ++ vma = find_vma(current->mm, start); ++ if (!vma) { ++ nv_mmap_read_unlock(current->mm); ++ status = NV_ERR_INVALID_ARGUMENT; ++ goto fail; ++ } ++ ++ vmas[i] = vma; ++ start = (start + PAGE_SIZE) & PAGE_MASK; ++ } ++ nv_mmap_read_unlock(current->mm); ++#endif + for (i = 0; i < num_pages; i++) { + if (page_count((*pages)[i]) > MAX_PAGE_COUNT || uvm_file_is_nvidia_uvm(vmas[i]->vm_file)) { + status = NV_ERR_INVALID_ARGUMENT; diff --git a/srcpkgs/nvidia390/files/linux-6.5-x86.patch b/srcpkgs/nvidia390/files/linux-6.5-x86.patch new file mode 100644 index 0000000000000..7f0635dcee4c6 --- /dev/null +++ b/srcpkgs/nvidia390/files/linux-6.5-x86.patch @@ -0,0 +1,327 @@ +diff --ignore-space-change --unified --recursive --no-dereference a/common/inc/nv-mm.h b/common/inc/nv-mm.h +--- a/common/inc/nv-mm.h 2022-10-12 06:30:26.000000000 -0300 ++++ b/common/inc/nv-mm.h 2023-09-02 15:39:35.376520074 -0300 +@@ -77,71 +77,14 @@ + #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) + #define NV_GET_USER_PAGES get_user_pages + #else ++ #if defined(NV_GET_USER_PAGES_DROPPED_VMA) + #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(start, nr_pages, flags, pages, vmas); +- } +- #endif +-#endif +- +-/* +- * get_user_pages_remote() was added by commit 1e9877902dc7 +- * ("mm/gup: Introduce get_user_pages_remote()") in v4.6 (2016-02-12). +- * +- * The very next commit cde70140fed8 ("mm/gup: Overload get_user_pages() +- * functions") deprecated the 8-argument version of get_user_pages for the +- * non-remote case (calling get_user_pages with current and current->mm). +- * +- * The guidelines are: call NV_GET_USER_PAGES_REMOTE if you need the 8-argument +- * version that uses something other than current and current->mm. Use +- * NV_GET_USER_PAGES if you are refering to current and current->mm. +- * +- * Note that get_user_pages_remote() requires the caller to hold a reference on +- * the task_struct (if non-NULL and if this API has tsk argument) and the mm_struct. +- * This will always be true when using current and current->mm. If the kernel passes +- * the driver a vma via driver callback, the kernel holds a reference on vma->vm_mm +- * over that callback. +- * +- * get_user_pages_remote() write/force parameters were replaced +- * with gup_flags by commit 9beae1ea8930 ("mm: replace get_user_pages_remote() +- * write/force parameters with gup_flags") in v4.9 (2016-10-13). +- * +- * get_user_pages_remote() added 'locked' parameter by commit 5b56d49fc31d +- * ("mm: add locked parameter to get_user_pages_remote()") in +- * v4.10 (2016-12-14). +- * +- * get_user_pages_remote() removed 'tsk' parameter by +- * commit 64019a2e467a ("mm/gup: remove task_struct pointer for +- * all gup code") in v5.9-rc1 (2020-08-11). +- * +- */ +- +-#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT) +- #if defined(NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS) +- #define NV_GET_USER_PAGES_REMOTE get_user_pages_remote +- #else +- 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) ++ struct page **pages) + { + unsigned int flags = 0; + +@@ -150,34 +93,12 @@ + if (force) + flags |= FOLL_FORCE; + +- #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG) +- #if defined (NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG) +- return get_user_pages_remote(tsk, mm, start, nr_pages, flags, +- pages, vmas, NULL); +- #else +- return get_user_pages_remote(mm, start, nr_pages, flags, +- pages, vmas, NULL); +- #endif +- +- #else +- +- return get_user_pages_remote(tsk, mm, start, nr_pages, flags, +- pages, vmas); +- +- #endif +- ++ return get_user_pages(start, nr_pages, flags, pages); + } +- #endif +-#else +- #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS) +- #define NV_GET_USER_PAGES_REMOTE NV_GET_USER_PAGES + #else + #include +- #include + +- static inline long NV_GET_USER_PAGES_REMOTE(struct task_struct *tsk, +- struct mm_struct *mm, +- unsigned long start, ++ static inline long NV_GET_USER_PAGES(unsigned long start, + unsigned long nr_pages, + int write, + int force, +@@ -191,12 +112,12 @@ + if (force) + flags |= FOLL_FORCE; + +- return get_user_pages(tsk, mm, start, nr_pages, flags, pages, vmas); ++ return get_user_pages(start, nr_pages, flags, pages, vmas); + } + #endif ++ #endif + #endif + +- + /* + * The .virtual_address field was effectively renamed to .address, by these + * two commits: +diff --ignore-space-change --unified --recursive --no-dereference a/conftest.sh b/conftest.sh +--- a/conftest.sh 2022-10-11 13:00:50.000000000 -0300 ++++ b/conftest.sh 2023-09-02 15:40:49.460261403 -0300 +@@ -3051,7 +3051,6 @@ + # write and force parameters AND that gup has task_struct and + # mm_struct as its first arguments. + # Return if available. +- # Fall through to default case if absent. + + echo "$CONFTEST_PREAMBLE + #include +@@ -3075,99 +3074,16 @@ + 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" +- +- return +- ;; +- +- get_user_pages_remote) +- # +- # Determine if the function get_user_pages_remote() is +- # present and has write/force/locked/tsk parameters. +- # +- # get_user_pages_remote() was added by: +- # 2016 Feb 12: 1e9877902dc7e11d2be038371c6fbf2dfcd469d7 +- # +- # get_user_pages[_remote]() write/force parameters +- # replaced with gup_flags: +- # 2016 Oct 12: 768ae309a96103ed02eb1e111e838c87854d8b51 +- # 2016 Oct 12: 9beae1ea89305a9667ceaab6d0bf46a045ad71e7 +- # +- # get_user_pages_remote() added 'locked' parameter +- # 2016 Dec 14:5b56d49fc31dbb0487e14ead790fc81ca9fb2c99 +- # +- # get_user_pages_remote() removed 'tsk' parameter by +- # commit 64019a2e467a ("mm/gup: remove task_struct pointer for +- # all gup code") in v5.9-rc1 (2020-08-11). +- # +- # conftest #1: check if get_user_pages_remote() is available +- # return if not available. +- # Fall through to conftest #2 if it is present +- +- echo "$CONFTEST_PREAMBLE +- #include +- void conftest_get_user_pages_remote(void) { +- get_user_pages_remote(); +- }" > 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_REMOTE_PRESENT" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- rm -f conftest$$.o +- return +- fi +- +- # conftest #2: check if get_user_pages_remote() has write and +- # force arguments. Return if these arguments are present +- # Fall through to conftest #3 if these args are absent. +- echo "#define NV_GET_USER_PAGES_REMOTE_PRESENT" | append_conftest "functions" +- echo "$CONFTEST_PREAMBLE +- #include +- long 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) { +- return 0; +- }" > conftest$$.c +- +- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 +- rm -f conftest$$.c +- +- if [ -f conftest$$.o ]; then +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- rm -f conftest$$.o +- return +- fi +- +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" ++ # Conftest #4: check if vma arg was dropped ++ # Return if available. ++ # Fall through to default case if absent. + +- # +- # conftest #3: check if get_user_pages_remote() has locked argument +- # Return if these arguments are present. Fall through to conftest #4 +- # if these args are absent. +- # + echo "$CONFTEST_PREAMBLE + #include +- long get_user_pages_remote(struct task_struct *tsk, +- struct mm_struct *mm, +- unsigned long start, ++ long get_user_pages(unsigned long start, + unsigned long nr_pages, + unsigned int gup_flags, +- struct page **pages, +- struct vm_area_struct **vmas, +- int *locked) { ++ struct page **pages) { + return 0; + }" > conftest$$.c + +@@ -3175,40 +3091,17 @@ + rm -f conftest$$.c + + if [ -f conftest$$.o ]; then +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" ++ echo "#define NV_GET_USER_PAGES_DROPPED_VMA" | append_conftest "functions" ++ echo "#undef NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions" ++ echo "#undef NV_GET_USER_PAGES_HAS_TASK_STRUCT" | append_conftest "functions" + rm -f conftest$$.o + return + fi + +- # +- # conftest #4: check if get_user_pages_remote() does not take +- # tsk argument. +- # +- echo "$CONFTEST_PREAMBLE +- #include +- long get_user_pages_remote(struct mm_struct *mm, +- unsigned long start, +- unsigned long nr_pages, +- unsigned int gup_flags, +- struct page **pages, +- struct vm_area_struct **vmas, +- int *locked) { +- 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_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- rm -f conftest$$.o +- else ++ 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" + +- echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions" +- echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions" +- fi ++ return + ;; + + usleep_range) +diff --ignore-space-change --unified --recursive --no-dereference a/nvidia/os-mlock.c b/nvidia/os-mlock.c +--- a/nvidia/os-mlock.c 2022-10-12 06:30:26.000000000 -0300 ++++ b/nvidia/os-mlock.c 2023-09-02 15:46:43.108702285 -0300 +@@ -127,8 +127,13 @@ + } + + nv_mmap_read_lock(mm); ++#if defined(NV_GET_USER_PAGES_DROPPED_VMA) ++ ret = NV_GET_USER_PAGES((unsigned long)address, ++ page_count, write, force, user_pages); ++#else + ret = NV_GET_USER_PAGES((unsigned long)address, + page_count, write, force, user_pages, NULL); ++#endif + nv_mmap_read_unlock(mm); + pinned = ret; + +diff --ignore-space-change --unified --recursive --no-dereference a/nvidia-drm/nvidia-drm-linux.c b/nvidia-drm/nvidia-drm-linux.c +--- a/nvidia-drm/nvidia-drm-linux.c 2022-10-12 06:30:31.000000000 -0300 ++++ b/nvidia-drm/nvidia-drm-linux.c 2023-09-02 15:44:37.601432752 -0300 +@@ -114,9 +114,13 @@ + } + + nv_mmap_read_lock(mm); +- ++#if defined(NV_GET_USER_PAGES_DROPPED_VMA) ++ pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force, ++ user_pages); ++#else + pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force, + user_pages, NULL); ++#endif + nv_mmap_read_unlock(mm); + + if (pages_pinned < 0 || (unsigned)pages_pinned < pages_count) { diff --git a/srcpkgs/nvidia390/template b/srcpkgs/nvidia390/template index 2f5088b14c014..3d888edb305b3 100644 --- a/srcpkgs/nvidia390/template +++ b/srcpkgs/nvidia390/template @@ -4,7 +4,7 @@ _desc="NVIDIA drivers (GeForce 400, 500 series)" pkgname=nvidia390 version=390.157 -revision=4 +revision=5 maintainer="Andrew Benson " license="custom:NVIDIA Proprietary" homepage="https://www.nvidia.com/en-us/drivers/unix/" @@ -43,10 +43,13 @@ do_patch() { patch ${patch_args} -i ${FILESDIR}/nvidia-470xx-fix-linux-6.2.patch case "$XBPS_TARGET_MACHINE" in i686) + patch ${patch_args} -i ${FILESDIR}/linux-6.5-x86.patch patch ${patch_args} -i ${FILESDIR}/linux6.3-x86.patch ;; x86_64) + patch ${patch_args} -i ${FILESDIR}/linux-6.5-x64.patch patch ${patch_args} -i ${FILESDIR}/linux6.3-x64.patch ;; esac + patch ${patch_args} -i ${FILESDIR}/linux-6.4.patch } pre_install() {