• Rodrigo Siqueira's avatar
    drm/drm_vblank: Change EINVAL by the correct errno · aed6105b
    Rodrigo Siqueira authored
    For historical reasons, the function drm_wait_vblank_ioctl always return
    -EINVAL if something gets wrong. This scenario limits the flexibility
    for the userspace to make detailed verification of any problem and take
    some action. In particular, the validation of “if (!dev->irq_enabled)”
    in the drm_wait_vblank_ioctl is responsible for checking if the driver
    support vblank or not. If the driver does not support VBlank, the
    function drm_wait_vblank_ioctl returns EINVAL, which does not represent
    the real issue; this patch changes this behavior by return EOPNOTSUPP.
    Additionally, drm_crtc_get_sequence_ioctl and
    drm_crtc_queue_sequence_ioctl, also returns EINVAL if vblank is not
    supported; this patch also changes the return value to EOPNOTSUPP in
    these functions. Lastly, these functions are invoked by libdrm, which is
    used by many compositors; because of this, it is important to check if
    this change breaks any compositor. In this sense, the following projects
    were examined:
    
    * Drm-hwcomposer
    * Kwin
    * Sway
    * Wlroots
    * Wayland
    * Weston
    * Mutter
    * Xorg (67 different drivers)
    
    For each repository the verification happened in three steps:
    
    * Update the main branch
    * Look for any occurrence of "drmCrtcQueueSequence",
      "drmCrtcGetSequence", and "drmWaitVBlank" with the command git grep -n
      "STRING".
    * Look in the git history of the project with the command
    git log -S<STRING>
    
    None of the above projects validate the use of EINVAL when using
    drmWaitVBlank(), which make safe, at least for these projects, to change
    the return values. On the other hand, mesa and xserver project uses
    drmCrtcQueueSequence() and drmCrtcGetSequence(); this change is harmless
    for both projects.
    
    Change since V5 (Pekka Paalanen):
     - Check if the change also affects Mutter
    
    Change since V4 (Daniel):
     - Also return EOPNOTSUPP in drm_crtc_[get|queue]_sequence_ioctl
    
    Change since V3:
     - Return EINVAL for _DRM_VBLANK_SIGNAL (Daniel)
    
    Change since V2:
     Daniel Vetter and Chris Wilson
     - Replace ENOTTY by EOPNOTSUPP
     - Return EINVAL if the parameters are wrong
    
    Cc: Keith Packard <keithp@keithp.com>
    Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Pekka Paalanen <pekka.paalanen@collabora.com>
    Signed-off-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Reviewed-by: default avatarDaniel Vetter <daniel@ffwll.ch>
    Acked-by: default avatarPekka Paalanen <pekka.paalanen@collabora.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20191002140516.adeyj3htylimmlmg@smtp.gmail.com
    aed6105b
drm_vblank.c 60.2 KB