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);