As written by Maarten: Not waiting on fences until they're signaled is an existing issue in i915, and was added as a workaround for a deadlock when GPU reset has to reset display as well on old platforms. This requires a modeset to disable everything, which may hang since it could wait on a fence that may only be signaled after GPU reset completes.
Limit the timeout on fence waits a) to platforms where GPU reset clobbers display, and b) when we're running forced display reset tests. This change only impacts i915, as xe has MAX_SCHEDULE_TIMEOUT in any case. Cc: Ville Syrjälä <[email protected]> Suggested-by: Maarten Lankhorst <[email protected]> Signed-off-by: Jani Nikula <[email protected]> --- drivers/gpu/drm/i915/display/intel_display.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index aa5d41dac8a9..76ec9161aaa3 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -74,6 +74,7 @@ #include "intel_display_driver.h" #include "intel_display_power.h" #include "intel_display_regs.h" +#include "intel_display_reset.h" #include "intel_display_rpm.h" #include "intel_display_types.h" #include "intel_display_utils.h" @@ -7277,15 +7278,20 @@ static void intel_atomic_commit_fence_wait(struct intel_atomic_state *state) struct intel_display *display = to_intel_display(state); struct drm_plane *plane; struct drm_plane_state *new_plane_state; - long ret; + long timeout, ret; int i; + if (intel_display_reset_needed_after_gpu_reset(display) || + intel_display_reset_test(display)) + timeout = i915_fence_timeout(); + else + timeout = MAX_SCHEDULE_TIMEOUT; + for_each_new_plane_in_state(&state->base, plane, new_plane_state, i) { if (!new_plane_state->fence) continue; - ret = dma_fence_wait_timeout(new_plane_state->fence, false, - i915_fence_timeout()); + ret = dma_fence_wait_timeout(new_plane_state->fence, false, timeout); if (!ret) ret = -ETIMEDOUT; if (ret < 0) { -- 2.47.3
