• C
    drm/i915: Late request cancellations are harmful · aa9b7810
    Chris Wilson 提交于
    Conceptually, each request is a record of a hardware transaction - we
    build up a list of pending commands and then either commit them to
    hardware, or cancel them. However, whilst building up the list of
    pending commands, we may modify state outside of the request and make
    references to the pending request. If we do so and then cancel that
    request, external objects then point to the deleted request leading to
    both graphical and memory corruption.
    
    The easiest example is to consider object/VMA tracking. When we mark an
    object as active in a request, we store a pointer to this, the most
    recent request, in the object. Then we want to free that object, we wait
    for the most recent request to be idle before proceeding (otherwise the
    hardware will write to pages now owned by the system, or we will attempt
    to read from those pages before the hardware is finished writing). If
    the request was cancelled instead, that wait completes immediately. As a
    result, all requests must be committed and not cancelled if the external
    state is unknown.
    
    All that remains of i915_gem_request_cancel() users are just a couple of
    extremely unlikely allocation failures, so remove the API entirely.
    
    A consequence of committing all incomplete requests is that we generate
    excess breadcrumbs and fill the ring much more often with dummy work. We
    have completely undone the outstanding_last_seqno optimisation.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93907Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
    Cc: stable@vger.kernel.org
    Reviewed-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: http://patchwork.freedesktop.org/patch/msgid/1460565315-7748-16-git-send-email-chris@chris-wilson.co.uk
    aa9b7810
i915_gem.c 138.3 KB