105 lines
3.5 KiB
Diff
105 lines
3.5 KiB
Diff
From 3b4e78d1107a4da33a805b161ade8f718454bd2d Mon Sep 17 00:00:00 2001
|
|
From: Eric Naim <dnaim@cachyos.org>
|
|
Date: Tue, 20 May 2025 00:11:56 +0800
|
|
Subject: [PATCH] Workaround nv_vm_flags_* calling GPL-only code
|
|
|
|
Since 6.15, the main body of vma_start_write() was uninlined and has
|
|
been made GPL-only code. This means that the closed modules can no
|
|
longer use vma_start_write() and functions calling it. Fortunately for
|
|
us, an NVIDIA driver hacker that tries to maintain the legacy drivers
|
|
for newer kernels claims that all VMAs that the driver uses are all
|
|
either initially mapped or already locked, this means that using
|
|
vm_flags_reset is sufficient to replace vm_flags_* helpers.
|
|
|
|
Signed-off-by: Eric Naim <dnaim@cachyos.org>
|
|
---
|
|
kernel-open/nvidia-drm/nvidia-drm-gem-user-memory.c | 7 +++++++
|
|
kernel-open/nvidia-drm/nvidia-drm-gem.c | 7 +++++++
|
|
kernel-open/nvidia-uvm/uvm.c | 7 +++++++
|
|
kernel-open/nvidia/nv-mmap.c | 7 +++++++
|
|
4 files changed, 28 insertions(+)
|
|
|
|
diff --git a/nvidia-drm/nvidia-drm-gem-user-memory.c b/nvidia-drm/nvidia-drm-gem-user-memory.c
|
|
index 91d56ebb5..6e07bb023 100644
|
|
--- a/nvidia-drm/nvidia-drm-gem-user-memory.c
|
|
+++ b/nvidia-drm/nvidia-drm-gem-user-memory.c
|
|
@@ -44,6 +44,13 @@
|
|
#include <vm/vm_pageout.h>
|
|
#endif
|
|
|
|
+#include <linux/version.h>
|
|
+
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
|
|
+#define nv_vm_flags_set(v, f) vm_flags_reset((v), (v)->vm_flags | (f))
|
|
+#define nv_vm_flags_clear(v, f) vm_flags_reset((v), (v)->vm_flags & ~(f))
|
|
+#endif
|
|
+
|
|
static inline
|
|
void __nv_drm_gem_user_memory_free(struct nv_drm_gem_object *nv_gem)
|
|
{
|
|
diff --git a/nvidia-drm/nvidia-drm-gem.c b/nvidia-drm/nvidia-drm-gem.c
|
|
index 5ac597823..8dff0abe6 100644
|
|
--- a/nvidia-drm/nvidia-drm-gem.c
|
|
+++ b/nvidia-drm/nvidia-drm-gem.c
|
|
@@ -51,6 +51,13 @@
|
|
|
|
#include "nv-mm.h"
|
|
|
|
+#include <linux/version.h>
|
|
+
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
|
|
+#define nv_vm_flags_set(v, f) vm_flags_reset((v), (v)->vm_flags | (f))
|
|
+#define nv_vm_flags_clear(v, f) vm_flags_reset((v), (v)->vm_flags & ~(f))
|
|
+#endif
|
|
+
|
|
void nv_drm_gem_free(struct drm_gem_object *gem)
|
|
{
|
|
struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem);
|
|
diff --git a/nvidia-uvm/uvm.c b/nvidia-uvm/uvm.c
|
|
index a9c182f82..bfec14dc0 100644
|
|
--- a/nvidia-uvm/uvm.c
|
|
+++ b/nvidia-uvm/uvm.c
|
|
@@ -21,6 +21,8 @@
|
|
|
|
*******************************************************************************/
|
|
|
|
+#include <linux/version.h>
|
|
+
|
|
#include "uvm_api.h"
|
|
#include "uvm_global.h"
|
|
#include "uvm_gpu_replayable_faults.h"
|
|
@@ -40,6 +42,11 @@
|
|
|
|
#define NVIDIA_UVM_DEVICE_NAME "nvidia-uvm"
|
|
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
|
|
+#define nv_vm_flags_set(v, f) vm_flags_reset((v), (v)->vm_flags | (f))
|
|
+#define nv_vm_flags_clear(v, f) vm_flags_reset((v), (v)->vm_flags & ~(f))
|
|
+#endif
|
|
+
|
|
static dev_t g_uvm_base_dev;
|
|
static struct cdev g_uvm_cdev;
|
|
static const struct file_operations uvm_fops;
|
|
diff --git a/nvidia/nv-mmap.c b/nvidia/nv-mmap.c
|
|
index 33c7d2982..813264c8f 100644
|
|
--- a/nvidia/nv-mmap.c
|
|
+++ b/nvidia/nv-mmap.c
|
|
@@ -23,10 +23,17 @@
|
|
|
|
#define __NO_VERSION__
|
|
|
|
+#include <linux/version.h>
|
|
+
|
|
#include "os-interface.h"
|
|
#include "nv-linux.h"
|
|
#include "nv_speculation_barrier.h"
|
|
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
|
|
+#define nv_vm_flags_set(v, f) vm_flags_reset((v), (v)->vm_flags | (f))
|
|
+#define nv_vm_flags_clear(v, f) vm_flags_reset((v), (v)->vm_flags & ~(f))
|
|
+#endif
|
|
+
|
|
/*
|
|
* The 'struct vm_operations' open() callback is called by the Linux
|
|
* kernel when the parent VMA is split or copied, close() when the
|