Skip to content

Instantly share code, notes, and snippets.

@Fjodor42
Created July 17, 2023 10:41
Show Gist options
  • Save Fjodor42/cfd29b3ffd1d1957894469f2def8f4f6 to your computer and use it in GitHub Desktop.
Save Fjodor42/cfd29b3ffd1d1957894469f2def8f4f6 to your computer and use it in GitHub Desktop.
Tentative fix for NVIDIA 535.54.03 driver for Linux 6.5-rc1
diff -Naurp nvidia-535.54.03.orig/common/inc/nv-mm.h nvidia-535.54.03/common/inc/nv-mm.h
--- nvidia-535.54.03.orig/common/inc/nv-mm.h 2023-06-07 01:06:49.000000000 +0200
+++ nvidia-535.54.03/common/inc/nv-mm.h 2023-07-17 12:35:45.635270852 +0200
@@ -23,6 +23,7 @@
#ifndef __NV_MM_H__
#define __NV_MM_H__
+#include <linux/version.h>
#include "conftest.h"
#if !defined(NV_VM_FAULT_T_IS_PRESENT)
@@ -41,7 +42,16 @@ typedef int vm_fault_t;
#include <linux/mm.h>
#include <linux/sched.h>
#if defined(NV_PIN_USER_PAGES_PRESENT)
- #define NV_PIN_USER_PAGES pin_user_pages
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)
+ static inline long NV_PIN_USER_PAGES(unsigned long start, unsigned long nr_pages,
+ unsigned int gup_flags, struct page **pages,
+ struct vm_area_struct **vmas) {
+ return pin_user_pages(start, nr_pages, gup_flags, pages);
+ }
+ #else
+ #define NV_PIN_USER_PAGES pin_user_pages
+ #endif
+
#define NV_UNPIN_USER_PAGE unpin_user_page
#else
#define NV_PIN_USER_PAGES NV_GET_USER_PAGES
@@ -66,7 +76,25 @@ typedef int vm_fault_t;
*
*/
-#if defined(NV_GET_USER_PAGES_HAS_ARGS_FLAGS)
+// Rel. commit. "mm/gup: remove unused vmas parameter from get_user_pages()" (Lorenzo Stoakes, 14 May 2023)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)
+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);
+}
+#elif defined(NV_GET_USER_PAGES_HAS_ARGS_FLAGS)
#define NV_GET_USER_PAGES get_user_pages
#elif defined(NV_GET_USER_PAGES_HAS_ARGS_TSK_FLAGS)
#define NV_GET_USER_PAGES(start, nr_pages, flags, pages, vmas) \
@@ -103,7 +131,14 @@ typedef int vm_fault_t;
*/
#if defined(NV_PIN_USER_PAGES_REMOTE_PRESENT)
- #if defined (NV_PIN_USER_PAGES_REMOTE_HAS_ARGS_TSK)
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)
+ static inline long NV_PIN_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 pin_user_pages_remote(mm, start, nr_pages, gup_flags, pages, locked);
+ }
+ #elif defined (NV_PIN_USER_PAGES_REMOTE_HAS_ARGS_TSK)
#define NV_PIN_USER_PAGES_REMOTE(mm, start, nr_pages, flags, pages, vmas, locked) \
pin_user_pages_remote(NULL, mm, start, nr_pages, flags, pages, vmas, locked)
#else
@@ -137,7 +172,20 @@ typedef int vm_fault_t;
*
*/
-#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT)
+//#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT)
+// Rel. commit. "mm/gup: remove unused vmas parameter from get_user_pages_remote()" (Lorenzo Stoakes, 14 May 2023)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)
+static inline long NV_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 get_user_pages_remote(mm, start, nr_pages, gup_flags, pages, locked);
+}
+#elif defined(NV_GET_USER_PAGES_REMOTE_PRESENT)
#if defined(NV_GET_USER_PAGES_REMOTE_HAS_ARGS_FLAGS_LOCKED)
#define NV_GET_USER_PAGES_REMOTE get_user_pages_remote
@Fjodor42
Copy link
Author

@babiulep
Copy link

Thank you, Fjodor!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment