[Intel-gfx] [PATCH] drm/i915: Skip context_barrier emission for unused contexts
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Jun 6 11:52:59 UTC 2019
On 06/06/2019 12:37, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2019-06-06 12:28:23)
>>
>> On 06/06/2019 12:06, Chris Wilson wrote:
>>> Quoting Tvrtko Ursulin (2019-06-06 10:19:10)
>>>>
>>>> On 06/06/2019 10:09, Chris Wilson wrote:
>>>>> Quoting Tvrtko Ursulin (2019-06-05 11:40:27)
>>>>>>
>>>>>> On 04/06/2019 16:24, Chris Wilson wrote:
>>>>>>> The intent was to skip unused HW contexts by checking ce->state.
>>>>>>> However, this only works for execlists where the ppGTT pointers is
>>>>>>> stored inside the HW context. For gen7, the ppGTT is alongside the
>>>>>>> logical state and must be updated on all active engines but, crucially,
>>>>>>> only on active engines. As we need different checks, and to keep
>>>>>>> context_barrier_task() agnostic, pass in the predicate.
>>>>>>>
>>>>>>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110836
>>>>>>> Fixes: 62c8e423450d ("drm/i915: Skip unused contexts for context_barrier_task()")
>>>>>>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>>>>>>> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>>>>>> ---
>>>>>>> drivers/gpu/drm/i915/gem/i915_gem_context.c | 15 ++++++++++++++-
>>>>>>> .../drm/i915/gem/selftests/i915_gem_context.c | 19 +++++++++++++++----
>>>>>>> 2 files changed, 29 insertions(+), 5 deletions(-)
>>>>>>>
>>>>>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
>>>>>>> index 08721ef62e4e..6819b598d226 100644
>>>>>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
>>>>>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
>>>>>>> @@ -902,6 +902,7 @@ static void cb_retire(struct i915_active *base)
>>>>>>> I915_SELFTEST_DECLARE(static intel_engine_mask_t context_barrier_inject_fault);
>>>>>>> static int context_barrier_task(struct i915_gem_context *ctx,
>>>>>>> intel_engine_mask_t engines,
>>>>>>> + bool (*skip)(struct intel_context *ce, void *data),
>>>>>>> int (*emit)(struct i915_request *rq, void *data),
>>>>>>> void (*task)(void *data),
>>>>>>> void *data)
>>>>>>> @@ -931,7 +932,10 @@ static int context_barrier_task(struct i915_gem_context *ctx,
>>>>>>> break;
>>>>>>> }
>>>>>>>
>>>>>>> - if (!(ce->engine->mask & engines) || !ce->state)
>>>>>>> + if (!(ce->engine->mask & engines))
>>>>>>> + continue;
>>>>>>> +
>>>>>>> + if (skip && skip(ce, data))
>>>>>>> continue;
>>>>>>>
>>>>>>> rq = intel_context_create_request(ce);
>>>>>>> @@ -1058,6 +1062,14 @@ static int emit_ppgtt_update(struct i915_request *rq, void *data)
>>>>>>> return 0;
>>>>>>> }
>>>>>>>
>>>>>>> +static bool skip_ppgtt_update(struct intel_context *ce, void *data)
>>>>>>> +{
>>>>>>> + if (HAS_LOGICAL_RING_CONTEXTS(ce->engine->i915))
>>>>>>> + return !ce->state;
>>>>>>> + else
>>>>>>> + return !atomic_read(&ce->pin_count);
>>>>>>
>>>>>> Would "return !atomic_read(&ce->pin_count) || !ce->state;" work and
>>>>>> avoid the somewhat irky HAS_LOGICAL_RING_CONTEXTS check?
>>>>>
>>>>> No, because we need the barrier on gen7 !rcs which doesn't have
>>>>> ce->state (but does need to switch mm).
>>>>
>>>> That's not the path which would be covered by !atomic_read(&ce->pin_count) ?
>>>
>>> And when pin_count > 0 it would then skip due to !ce->state, leading us
>>> back to the current problem.
>>
>> Brain fart.. Okay.. but pin_count check itself is not sufficient for
>> both platforms? Can't we skip pin_count == 0 && ce->state != NULL on
>> execlists?
>
> Alas not. It is really is a divergence in HW behaviour.
>
> For execlists, we need to modifying an existing context image, but may
> skip if there is no image at all (as it will be constructed with the
> right registers).
>
> For gen7, we need to take care of the supplementary pinning of
> ctx->ppgtt. That is done for us on the first context_pin, but when
> pin_count > 0, we must fiddle. Fiddly fiddling. There's probably a way
> to resolve it without having to pull so much lower level detail into
> i915_gem_context.c, I am not seeing it atm (and honestly not looking too
> hard ;).
Okay, I don't fancy looking too hard either. It was only a discussion
about a potential optimisation to begin with. So without much further ado:
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list