• Chris Wilson's avatar
    drm/i915: Prevent leaking of -EIO from i915_wait_request() · f4457ae7
    Chris Wilson authored
    Reporting -EIO from i915_wait_request() has proven very troublematic
    over the years, with numerous hard-to-reproduce bugs cropping up in the
    corner case of where a reset occurs and the code wasn't expecting such
    an error.
    
    If the we reset the GPU or have detected a hang and wish to reset the
    GPU, the request is forcibly complete and the wait broken. Currently, we
    report either -EAGAIN or -EIO in order for the caller to retreat and
    restart the wait (if appropriate) after dropping and then reacquiring
    the struct_mutex (essential to allow the GPU reset to proceed). However,
    if we take the view that the request is complete (no further work will
    be done on it by the GPU because it is dead and soon to be reset), then
    we can proceed with the task at hand and then drop the struct_mutex
    allowing the reset to occur. This transfers the burden of checking
    whether it is safe to proceed to the caller, which in all but one
    instance it is safe - completely eliminating the source of all spurious
    -EIO.
    
    Of note, we only have two API entry points where we expect that
    userspace can observe an EIO. First is when submitting an execbuf, if
    the GPU is terminally wedged, then the operation cannot succeed and an
    -EIO is reported. Secondly, existing userspace uses the throttle ioctl
    to detect an already wedged GPU before starting using HW acceleration
    (or to confirm that the GPU is wedged after an error condition). So if
    the GPU is wedged when the user calls throttle, also report -EIO.
    
    v2: Split more carefully the change to i915_wait_request() and assorted
    ABI from the reset handling.
    v3: Add a couple of WARN_ON(EIO) to the interruptible modesetting code
    so that we don't start to leak EIO there in future (and break our hang
    resistant modesetting).
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: http://patchwork.freedesktop.org/patch/msgid/1460565315-7748-9-git-send-email-chris@chris-wilson.co.uk
    Link: http://patchwork.freedesktop.org/patch/msgid/1460565315-7748-1-git-send-email-chris@chris-wilson.co.uk
    f4457ae7
intel_ringbuffer.c 89.1 KB