From 886c1cfe610748bd0277b2f74f77606713e6d33d Mon Sep 17 00:00:00 2001 From: Igor Moura Date: Wed, 14 Apr 2021 20:24:33 -0300 Subject: [PATCH] feat: add vgpu_unlock patch This allows to have the driver working with newer kernels (tested with 5.11.12 at the moment of this commit), along with applying all of the required changes to get the unlock working automatically. --- vgpu_unlock.patch | 152 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 vgpu_unlock.patch diff --git a/vgpu_unlock.patch b/vgpu_unlock.patch new file mode 100644 index 0000000..4ce27aa --- /dev/null +++ b/vgpu_unlock.patch @@ -0,0 +1,152 @@ +diff --git kernel/nvidia/nv-caps.c kernel/nvidia/nv-caps.c +index 90e866f..7151944 100644 +--- kernel/nvidia/nv-caps.c ++++ kernel/nvidia/nv-caps.c +@@ -37,8 +37,12 @@ MODULE_PARM_DESC(nv_cap_enable_devfs, "Enable (1) or disable (0) nv-caps " \ + + extern int NVreg_ModifyDeviceFiles; + ++#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd ++#include ++#else + /* sys_close() or __close_fd() */ + #include ++#endif + + #define NV_CAP_DRV_MINOR_COUNT 8192 + +@@ -581,12 +585,18 @@ void NV_API_CALL nv_cap_close_fd(int fd) + } + + /* +- * From v4.17-rc1 kernels have stopped exporting sys_close(fd) and started +- * exporting __close_fd, as of this commit: ++ * From v4.17-rc1 (to v5.10.8) kernels have stopped exporting sys_close(fd) ++ * and started exporting __close_fd, as of this commit: + * 2018-04-02 2ca2a09d6215 ("fs: add ksys_close() wrapper; remove in-kernel +- * calls to sys_close()") ++ * calls to sys_close()") ++ * Kernels v5.11-rc1 onwards have stopped exporting __close_fd, and started ++ * exporting close_fd, as of this commit: ++ * 2020-12-20 8760c909f54a ("file: Rename __close_fd to close_fd and remove ++ * the files parameter") + */ +-#if NV_IS_EXPORT_SYMBOL_PRESENT___close_fd ++#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd ++ close_fd(fd); ++#elif NV_IS_EXPORT_SYMBOL_PRESENT___close_fd + __close_fd(current->files, fd); + #else + sys_close(fd); +diff --git kernel/nvidia/nvidia.Kbuild kernel/nvidia/nvidia.Kbuild +index 8fc929e..193e7b3 100644 +--- kernel/nvidia/nvidia.Kbuild ++++ kernel/nvidia/nvidia.Kbuild +@@ -173,6 +173,7 @@ NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_tegra_dce_client_ip + NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_dram_clk_to_mc_clk + NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_get_dram_num_channels + NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_tegra_dram_types ++NV_CONFTEST_SYMBOL_COMPILE_TESTS += is_export_symbol_present_close_fd + + NV_CONFTEST_TYPE_COMPILE_TESTS += acpi_op_remove + NV_CONFTEST_TYPE_COMPILE_TESTS += outer_flush_all +@@ -210,3 +211,6 @@ NV_CONFTEST_GENERIC_COMPILE_TESTS += get_user_pages + NV_CONFTEST_GENERIC_COMPILE_TESTS += get_user_pages_remote + NV_CONFTEST_GENERIC_COMPILE_TESTS += pm_runtime_available + NV_CONFTEST_GENERIC_COMPILE_TESTS += vm_fault_t ++ ++# vgpu unlock ++ldflags-y += -T /opt/vgpu_unlock/kern.ld +diff --git init-scripts/systemd/nvidia-vgpud.service init-scripts/systemd/nvidia-vgpud.service +index 2da8ff5..7b58195 100644 +--- init-scripts/systemd/nvidia-vgpud.service ++++ init-scripts/systemd/nvidia-vgpud.service +@@ -13,8 +13,9 @@ Wants=syslog.target + + [Service] + Type=forking +-ExecStart=/usr/bin/nvidia-vgpud ++ExecStart=/opt/vgpu_unlock/vgpu_unlock /usr/bin/nvidia-vgpud + ExecStopPost=/bin/rm -rf /var/run/nvidia-vgpud ++Environment="__RM_NO_VERSION_CHECK=1" + + [Install] + WantedBy=multi-user.target +diff --git init-scripts/systemd/nvidia-vgpu-mgr.service init-scripts/systemd/nvidia-vgpu-mgr.service +index 24276b3..b50e672 100644 +--- init-scripts/systemd/nvidia-vgpu-mgr.service ++++ init-scripts/systemd/nvidia-vgpu-mgr.service +@@ -14,8 +14,9 @@ Wants=syslog.target + [Service] + Type=forking + KillMode=process +-ExecStart=/usr/bin/nvidia-vgpu-mgr ++ExecStart=/opt/vgpu_unlock/vgpu_unlock /usr/bin/nvidia-vgpu-mgr + ExecStopPost=/bin/rm -rf /var/run/nvidia-vgpu-mgr ++Environment="__RM_NO_VERSION_CHECK=1" + + [Install] + WantedBy=multi-user.target +diff --git kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c +index a3cc030..22666a2 100644 +--- kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c ++++ kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c +@@ -2526,14 +2526,18 @@ static irqreturn_t vgpu_msix_handler(int irq, void *arg) + + if (pfile && pfile->f_op && pfile->f_op->write) + { +- old_fs = get_fs(); +- set_fs(KERNEL_DS); ++ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) ++ old_fs = get_fs(); ++ set_fs(KERNEL_DS); ++ #endif + + NV_SAVE_FLAGS(eflags); + ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset); + NV_RESTORE_FLAGS(eflags); + +- set_fs(old_fs); ++ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) ++ set_fs(old_fs); ++ #endif + } + + return IRQ_HANDLED; +@@ -2816,8 +2820,10 @@ NV_STATUS nv_vgpu_inject_interrupt(void *vgpuRef) + } + NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); + +- old_fs = get_fs(); +- set_fs(KERNEL_DS); ++ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) ++ old_fs = get_fs(); ++ set_fs(KERNEL_DS); ++ #endif + + if (pfile->f_op && pfile->f_op->write) + ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset); +@@ -2827,7 +2833,9 @@ NV_STATUS nv_vgpu_inject_interrupt(void *vgpuRef) + if (ret < 0) + status = NV_ERR_INVALID_STATE; + +- set_fs(old_fs); ++ #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)) ++ set_fs(old_fs); ++ #endif + + return status; + } +diff --git kernel/nvidia/os-interface.c kernel/nvidia/os-interface.c +index 1484143..fb56ffc 100644 +--- kernel/nvidia/os-interface.c ++++ kernel/nvidia/os-interface.c +@@ -16,7 +16,7 @@ + + #include "nv-time.h" + +- ++#include "/opt/vgpu_unlock/vgpu_unlock_hooks.c" + + +