From 282726d5d474d00baa8bf47d689f126ac048c8f8 Mon Sep 17 00:00:00 2001 From: Paul Moses
Date: Wed, 18 Feb 2026 17:39:34 -0600 Subject: [PATCH] nvidia-drm: handle -EDEADLK in nv_drm_reset_input_colorspace drm_atomic_get_plane_state() and drm_atomic_commit() can return -EDEADLK when ww-mutex deadlock avoidance triggers. The current nv_drm_reset_input_colorspace() path drops locks and returns without running the required modeset backoff/retry flow. Rework the function to retry the atomic sequence with drm_modeset_backoff(&ctx), rebuilding atomic state on each retry, and only finish once the sequence succeeds or another error is returned. Signed-off-by: Paul Moses
--- kernel-open/nvidia-drm/nvidia-drm-drv.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c index e9ef77c94..7f9d02c70 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-drv.c +++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c @@ -937,21 +937,25 @@ int nv_drm_reset_input_colorspace(struct drm_device *dev) bool do_reset = false; NvU32 flags = 0; - state = drm_atomic_state_alloc(dev); - if (!state) - return -ENOMEM; - #if defined(DRM_MODESET_ACQUIRE_INTERRUPTIBLE) flags |= DRM_MODESET_ACQUIRE_INTERRUPTIBLE; #endif drm_modeset_acquire_init(&ctx, flags); + +retry: + do_reset = false; + state = drm_atomic_state_alloc(dev); + if (!state) { + ret = -ENOMEM; + goto out; + } state->acquire_ctx = &ctx; nv_drm_for_each_plane(plane, dev) { plane_state = drm_atomic_get_plane_state(state, plane); if (IS_ERR(plane_state)) { ret = PTR_ERR(plane_state); - goto out; + goto put_state; } nv_drm_plane_state = to_nv_drm_plane_state(plane_state); @@ -967,8 +971,17 @@ int nv_drm_reset_input_colorspace(struct drm_device *dev) ret = drm_atomic_commit(state); } -out: +put_state: drm_atomic_state_put(state); + + if (ret == -EDEADLK) { + ret = drm_modeset_backoff(&ctx); + if (!ret) { + goto retry; + } + } + +out: drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx);