• Chris Wilson's avatar
    drm/i915: Look for an active kernel context before switching · 09a4c02e
    Chris Wilson authored
    We were not very carefully checking to see if an older request on the
    engine was an earlier switch-to-kernel-context before deciding to emit a
    new switch. The end result would be that we could get into a permanent
    loop of trying to emit a new request to perform the switch simply to
    flush the existing switch.
    
    What we need is a means of tracking the completion of each timeline
    versus the kernel context, that is to detect if a more recent request
    has been submitted that would result in a switch away from the kernel
    context. To realise this, we need only to look in our syncmap on the
    kernel context and check that we have synchronized against all active
    rings.
    
    v2: Since all ringbuffer clients currently share the same timeline, we do
    have to use the gem_context to distinguish clients.
    
    As a bonus, include all the tracing used to debug the death inside
    suspend.
    
    v3: Test, test, test. Construct a selftest to exercise and assert the
    expected behaviour that multiple switch-to-contexts do not emit
    redundant requests.
    Reported-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
    Fixes: a89d1f92 ("drm/i915: Split i915_gem_timeline into individual timelines")
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Mika Kuoppala <mika.kuoppala@intel.com>
    Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20180524081135.15278-1-chris@chris-wilson.co.uk
    09a4c02e
i915_gem_context.c 14.5 KB