• Maarten Lankhorst's avatar
    drm/atomic: Fix freeing connector/plane state too early by tracking commits, v3. · 21a01abb
    Maarten Lankhorst authored
    Currently we neatly track the crtc state, but forget to look at
    plane/connector state.
    
    When doing a nonblocking modeset, immediately followed by a setprop
    before the modeset completes, the setprop will see the modesets new
    state as the old state and free it.
    
    This has to be solved by waiting for hw_done on the connector, even
    if it's not assigned to a crtc. When a connector is unbound we take
    the last crtc commit, and when it stays unbound we create a new
    fake crtc commit for that gets signaled on hw_done for all the
    planes/connectors.
    
    We wait for it the same way as we do for crtc's, which will make
    sure we never run into a use-after-free situation.
    
    Changes since v1:
    - Only create a single disable commit. (danvet)
    - Fix leak in intel_legacy_cursor_update.
    Changes since v2:
    - Make reference counting in drm_atomic_helper_setup_commit
      more obvious. (pinchartl)
    - Call cleanup_done for fake commit. (danvet)
    - Add comments to drm_atomic_helper_setup_commit. (danvet, pinchartl)
    - Add comment to drm_atomic_helper_swap_state. (pinchartl)
    Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Testcase: kms_atomic_transition.plane-use-after-nonblocking-unbind*
    Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20170904104838.23822-6-maarten.lankhorst@linux.intel.comReviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    21a01abb
drm_atomic.c 69.4 KB