• Chris Wilson's avatar
    drm/i915: Retire requests along rings · b887d615
    Chris Wilson authored
    In the next patch, rings are the central timeline as requests may jump
    between engines. Therefore in the future as we retire in order along the
    engine timeline, we may retire out-of-order within a ring (as the ring now
    occurs along multiple engines), leading to much hilarity in miscomputing
    the position of ring->head.
    
    As an added bonus, retiring along the ring reduces the penalty of having
    one execlists client do cleanup for another (old legacy submission
    shares a ring between all clients). The downside is that slow and
    irregular (off the critical path) process of cleaning up stale requests
    after userspace becomes a modicum less efficient.
    
    In the long run, it will become apparent that the ordered
    ring->request_list matches the ring->timeline, a fun challenge for the
    future will be unifying the two lists to avoid duplication!
    
    v2: We need both engine-order and ring-order processing to maintain our
    knowledge of where individual rings have completed upto as well as
    knowing what was last executing on any engine. And finally by decoupling
    retiring the contexts on the engine and the timelines along the rings,
    we do have to keep a reference to the context on each request
    (previously it was guaranteed by the context being pinned).
    
    v3: Not just a reference to the context, but we need to keep it pinned
    as we manipulate the rings; i.e. we need a pin for both the manipulation
    of the engine state during its retirements, and a separate pin for the
    manipulation of the ring state.
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20180430131503.5375-3-chris@chris-wilson.co.uk
    b887d615
intel_ringbuffer.c 54.9 KB