• Mario Kleiner's avatar
    drm/radeon: Don't hang in radeon_flip_work_func on disabled crtc. (v2) · 2b8341b3
    Mario Kleiner authored
    This fixes a regression introduced in Linux 4.4.
    
    Limit the amount of time radeon_flip_work_func can
    delay programming a page flip, by both limiting the
    maximum amount of time per wait cycle and the maximum
    number of wait cycles. Continue the flip if the limit
    is exceeded, even if that may result in a visual or
    timing glitch.
    
    This is to prevent a hang of page flips, as reported
    in fdo bug #93746: Disconnecting a DisplayPort display
    in parallel to a kms pageflip getting queued can cause
    the following hang of page flips and thereby an unusable
    desktop:
    
    1. kms pageflip ioctl() queues pageflip -> queues execution
       of radeon_flip_work_func.
    
    2. Hotunplug of display causes the driver to DPMS OFF
       the unplugged display. Display engine shuts down,
       scanout no longer moves, but stays at its resting
       position at start line of vblank.
    
    3. radeon_flip_work_func executes while crtc is off, and
       due to the non-moving scanout position, the new flip
       delay code introduced into Linux 4.4 by
       commit 5b5561b3 ("drm/radeon: Fixup hw vblank counter/ts..")
       enters an infinite wait loop.
    
    4. After reconnecting the display, the pageflip continues
       to hang in 3. and the display doesn't update its view
       of the desktop.
    
    This patch fixes the Linux 4.4 regression from fdo bug #93746
    
    <https://bugs.freedesktop.org/show_bug.cgi?id=93746>
    
    v2: Skip wait immediately if !radeon_crtc->enabled, as
        suggested by Michel.
    Reported-by: default avatarBernd Steinhauser <linux@bernd-steinhauser.de>
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Tested-by: default avatarBernd Steinhauser <linux@bernd-steinhauser.de>
    
    Cc: <stable@vger.kernel.org> # 4.4+
    Cc: Michel Dänzer <michel.daenzer@amd.com>
    Cc: Alex Deucher <alexander.deucher@amd.com>
    Reviewed-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    2b8341b3
radeon_display.c 61.7 KB