From 27b24edf9d2b491950ea4a250902e8a114beee5de881864637ddbb423323a1ec Mon Sep 17 00:00:00 2001 From: Stefan Dirsch Date: Sat, 4 Jan 2025 13:07:59 +0000 Subject: [PATCH] - set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch * needed for Kernel 6.12 for 565.57.01 driver; already fixed for 550.142 --> https://forums.developer.nvidia.com/t/patch-for-565-57-01-linux-kernel-6-12/313260 OBS-URL: https://build.opensuse.org/package/show/X11:Drivers:Video:Redesign/nvidia-open-driver-G06-signed?expand=0&rev=169 --- nvidia-open-driver-G06-signed.changes | 8 ++ nvidia-open-driver-G06-signed.spec | 5 +- ...NED_OFFSET-for-nv_drm_fops.fop_flags.patch | 92 +++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch diff --git a/nvidia-open-driver-G06-signed.changes b/nvidia-open-driver-G06-signed.changes index e473c03..52a65a1 100644 --- a/nvidia-open-driver-G06-signed.changes +++ b/nvidia-open-driver-G06-signed.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Sat Jan 4 12:42:00 UTC 2025 - Stefan Dirsch + +- set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch + * needed for Kernel 6.12 for 565.57.01 driver; already fixed + for 550.142 + --> https://forums.developer.nvidia.com/t/patch-for-565-57-01-linux-kernel-6-12/313260 + ------------------------------------------------------------------- Tue Dec 17 23:51:04 UTC 2024 - Stefan Dirsch diff --git a/nvidia-open-driver-G06-signed.spec b/nvidia-open-driver-G06-signed.spec index e834dc3..214d171 100644 --- a/nvidia-open-driver-G06-signed.spec +++ b/nvidia-open-driver-G06-signed.spec @@ -1,7 +1,7 @@ # # spec file for package nvidia-open-driver-G06-signed # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -87,6 +87,9 @@ Source12: pesign-spec-macros Source14: group-source-files.pl Source15: kmp-trigger.sh Patch0: persistent-nvidia-id-string.patch +%if %{with cuda} +Patch1: set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch +%endif %if "%{flavor}" != "cuda" %ifarch aarch64 %if 0%{?suse_version} >= 1600 diff --git a/set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch b/set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch new file mode 100644 index 0000000..b146500 --- /dev/null +++ b/set-FOP_UNSIGNED_OFFSET-for-nv_drm_fops.fop_flags.patch @@ -0,0 +1,92 @@ +From 8ac26d3c66ea88b0f80504bdd1e907658b41609d Mon Sep 17 00:00:00 2001 +From: Rahul Rameshbabu +Date: Tue, 12 Nov 2024 15:01:16 -0800 +Subject: [PATCH] nvidia-drm: Set FOP_UNSIGNED_OFFSET for nv_drm_fops.fop_flags + if present + +Linux kernel commit 641bb4394f40 ("fs: move FMODE_UNSIGNED_OFFSET to +fop_flags") introduced a new .fop_flags define, FOP_UNSIGNED_OFFSET, for +struct file_operations. A check in drm_open_helper was added to ensure DRM +device drivers mark that all file offsets passed for working with DRM fs +nodes are unsigned values. If a DRM device driver fails to set this static +member, opening DRM device nodes (/dev/dri/card*) will fail. This commit +will land in Linux kernel v6.12. + +To ensure DRM clients will continue to function with kernel v6.12 and +above, set FOP_UNSIGNED_OFFSET for nv_drm_fops.fop_flags if +FOP_UNSIGNED_OFFSET is present in the linux kernel headers being built +against. Without doing so, userspace DRM clients will fail to function. An +example is being unable to launch Wayland compositors. + +KWin logs without this change: + kwin_core: Failed to open /dev/dri/card1 device (Invalid argument) + kwin_wayland_drm: failed to open drm device at "/dev/dri/card1" + kwin_core: Failed to open /dev/dri/card0 device (Invalid argument) + kwin_wayland_drm: failed to open drm device at "/dev/dri/card0" + kwin_wayland_drm: No suitable DRM devices have been found + +Linux kernel warning generated without this change: + [Oct 2 02:15] ------------[ cut here ]------------ + [ +0.000009] WARNING: CPU: 2 PID: 464 at drivers/gpu/drm/drm_file.c:312 drm_open_helper+0x134/0x150 + + [ +0.000108] Unloaded tainted modules: nvidia(OE):1 nvidia_modeset(OE):1 nvidia_drm(OE):1 [last unloaded: ttm] + [ +0.000024] CPU: 2 UID: 0 PID: 464 Comm: systemd-logind Tainted: G OE 6.12.0-rc1-next-20241001-sound+ #10 c8090f98b0209abebde89ba1e4c08c75331eef4d + [ +0.000016] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE + [ +0.000004] Hardware name: System manufacturer PRIME Z390-A/PRIME Z390-A, BIOS 0224 08/14/2018 + [ +0.000005] RIP: 0010:drm_open_helper+0x134/0x150 + + [ +0.000005] Call Trace: + [ +0.000006] + [ +0.000004] ? drm_open_helper+0x134/0x150 + [ +0.000008] ? __warn.cold+0x93/0xf6 + [ +0.000011] ? drm_open_helper+0x134/0x150 + [ +0.000009] ? report_bug+0xff/0x140 + [ +0.000009] ? handle_bug+0x58/0x90 + [ +0.000010] ? exc_invalid_op+0x17/0x70 + [ +0.000010] ? asm_exc_invalid_op+0x1a/0x20 + [ +0.000018] ? drm_open_helper+0x134/0x150 + [ +0.000008] drm_open+0x73/0x110 + [ +0.000007] drm_stub_open+0x9b/0xd0 + [ +0.000009] chrdev_open+0xb0/0x230 + [ +0.000014] ? __pfx_chrdev_open+0x10/0x10 + [ +0.000011] do_dentry_open+0x14c/0x4a0 + [ +0.000013] vfs_open+0x2e/0xe0 + [ +0.000009] path_openat+0x82f/0x13f0 + [ +0.000016] do_filp_open+0xc4/0x170 + [ +0.000020] do_sys_openat2+0xae/0xe0 + [ +0.000010] __x64_sys_openat+0x55/0xa0 + [ +0.000009] do_syscall_64+0x82/0x190 + [ +0.000008] ? do_readlinkat+0xc5/0x180 + [ +0.000008] ? syscall_exit_to_user_mode+0x37/0x1c0 + [ +0.000010] ? do_syscall_64+0x8e/0x190 + [ +0.000007] ? do_sys_openat2+0x9c/0xe0 + [ +0.000009] ? syscall_exit_to_user_mode+0x37/0x1c0 + [ +0.000008] ? do_syscall_64+0x8e/0x190 + [ +0.000007] ? syscall_exit_to_user_mode+0x37/0x1c0 + [ +0.000007] ? do_syscall_64+0x8e/0x190 + [ +0.000006] ? do_syscall_64+0x8e/0x190 + [ +0.000007] entry_SYSCALL_64_after_hwframe+0x76/0x7e + [ +0.000012] RIP: 0033:0x7f90c1cec2e3 + + [ +0.000004] ---[ end trace 0000000000000000 ]--- + +Signed-off-by: Rahul Rameshbabu +--- + kernel-open/nvidia-drm/nvidia-drm-drv.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c +index 8cb942193..16f0d13e1 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-drv.c ++++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c +@@ -1711,6 +1711,10 @@ static const struct file_operations nv_drm_fops = { + .read = drm_read, + + .llseek = noop_llseek, ++ ++#if defined(FOP_UNSIGNED_OFFSET) ++ .fop_flags = FOP_UNSIGNED_OFFSET, ++#endif + }; + + static const struct drm_ioctl_desc nv_drm_ioctls[] = {