• Chris Wilson's avatar
    drm/i915: Unify active context tracking between legacy/execlists/guc · e8a9c58f
    Chris Wilson authored
    The requests conversion introduced a nasty bug where we could generate a
    new request in the middle of constructing a request if we needed to idle
    the system in order to evict space for a context. The request to idle
    would be executed (and waited upon) before the current one, creating a
    minor havoc in the seqno accounting, as we will consider the current
    request to already be completed (prior to deferred seqno assignment) but
    ring->last_retired_head would have been updated and still could allow
    us to overwrite the current request before execution.
    
    We also employed two different mechanisms to track the active context
    until it was switched out. The legacy method allowed for waiting upon an
    active context (it could forcibly evict any vma, including context's),
    but the execlists method took a step backwards by pinning the vma for
    the entire active lifespan of the context (the only way to evict was to
    idle the entire GPU, not individual contexts). However, to circumvent
    the tricky issue of locking (i.e. we cannot take struct_mutex at the
    time of i915_gem_request_submit(), where we would want to move the
    previous context onto the active tracker and unpin it), we take the
    execlists approach and keep the contexts pinned until retirement.
    The benefit of the execlists approach, more important for execlists than
    legacy, was the reduction in work in pinning the context for each
    request - as the context was kept pinned until idle, it could short
    circuit the pinning for all active contexts.
    
    We introduce new engine vfuncs to pin and unpin the context
    respectively. The context is pinned at the start of the request, and
    only unpinned when the following request is retired (this ensures that
    the context is idle and coherent in main memory before we unpin it). We
    move the engine->last_context tracking into the retirement itself
    (rather than during request submission) in order to allow the submission
    to be reordered or unwound without undue difficultly.
    
    And finally an ulterior motive for unifying context handling was to
    prepare for mock requests.
    
    v2: Rename to last_retired_context, split out legacy_context tracking
    for MI_SET_CONTEXT.
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20161218153724.8439-3-chris@chris-wilson.co.uk
    e8a9c58f
intel_ringbuffer.c 73.2 KB