• Ville Syrjälä's avatar
    drm/atomic-helper: Complete fake_commit->flip_done potentially earlier · 2de42f79
    Ville Syrjälä authored
    Consider the following scenario:
    1. nonblocking enable crtc
    2. wait for the event
    3. nonblocking disable crtc
    
    On i915 this can lead to a spurious -EBUSY from step 3 on
    account of non-enabled planes getting the fake_commit in step 1
    and we don't complete the fake_commit-> flip_done until
    drm_atomic_helper_commit_hw_done() which can happen a long
    time after the flip event was sent out.
    
    This will become somewhat easy to hit on SKL+ once we start
    to add all the planes for the crtc to every modeset commit
    for the purposes of forcing a watermark register programming
    [1].
    
    To make the race a little less pronounced let's complete
    fake_commit->flip_done after drm_atomic_helper_wait_for_flip_done().
    For the single crtc case this should make the race quite
    theoretical, assuming drm_atomic_helper_wait_for_flip_done()
    actually has to wait for the real commit flip_done. In case
    the real commit flip_done gets completed singificantly before
    drm_atomic_helper_wait_for_flip_done(), or we are dealing with
    multiple crtcs whose vblanks don't line up nicely the race still
    exists.
    
    [1] https://patchwork.freedesktop.org/patch/262670/
    
    Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Fixes: 080de2e5 ("drm/atomic: Check for busy planes/connectors before setting the commit")
    Testcase: igt/kms_cursor_legacy/*nonblocking-modeset-vs-cursor-atomic
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181122143412.11655-1-ville.syrjala@linux.intel.comReviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
    2de42f79
drm_atomic_helper.c 103 KB