Skip to content
  • Antonio Borneo's avatar
    backend-drm: fix race during system suspend · c90fccc2
    Antonio Borneo authored and Daniel Stone's avatar Daniel Stone committed
    
    
    Depending on system loading, weston-launcher could drop the drm
    master access before the compositor and all the clients receive
    the notification. In this case, some commit could be sent to the
    drm driver too late and get refused with error EACCES.
    This error condition is not properly managed and causes weston to
    hang.
    
    Change the return type of start_repaint_loop() and repaint_flush()
    from void to int, and return 0 on success or -1 if the repaint has
    to be cancelled.
    In the callers of start_repaint_loop() and repaint_flush() handle
    the return value and cancel the repaint when needed.
    In backend-drm detect the error EACCES and return -1.
    Note: to keep the code cleaner, this change inverts the execution
    order between weston_output_schedule_repaint_reset() and
    repaint_cancel().
    
    No need to wait for suspend or for any notification; in case the
    weston reschedules a repaint, it will get EACCES again.
    At resume, damage-all guarantees a complete repaint.
    
    This fix is for atomic modeset only.
    Legacy modeset suffers from similar problems, but it is not fixed
    by this change. Since drm_pending_state_apply() never returns
    error for legacy modeset, this change has no impact on legacy
    modeset.
    
    Signed-off-by: default avatarAntonio Borneo <antonio.borneo@st.com>
    Fixes: https://gitlab.freedesktop.org/wayland/weston/issues/117
    c90fccc2