[Intel-gfx] [PATCH 03/43] drm/i915/selftests: Improve switch-to-kernel-context checking
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Thu Mar 7 12:40:43 UTC 2019
On 06/03/2019 14:24, Chris Wilson wrote:
> We can reduce the switch-to-kernel-context selftest to operate as a loop
> and so trivially test another state transition (that of idle->busy).
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> .../gpu/drm/i915/selftests/i915_gem_context.c | 80 ++++++++-----------
> 1 file changed, 35 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> index 34a8c15273f4..cb3d77c95ddf 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -1495,63 +1495,55 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
> {
> struct intel_engine_cs *engine;
> unsigned int tmp;
> - int err;
> + int pass;
>
> GEM_TRACE("Testing %s\n", __engine_name(i915, engines));
> - for_each_engine_masked(engine, i915, engines, tmp) {
> - struct i915_request *rq;
> + for (pass = 0; pass < 4; pass++) { /* Once busy; once idle; repeat */
> + bool from_idle = pass & 1;
> + int err;
>
> - rq = i915_request_alloc(engine, ctx);
> - if (IS_ERR(rq))
> - return PTR_ERR(rq);
> + if (!from_idle) {
> + for_each_engine_masked(engine, i915, engines, tmp) {
> + struct i915_request *rq;
>
> - i915_request_add(rq);
> - }
> + rq = i915_request_alloc(engine, ctx);
> + if (IS_ERR(rq))
> + return PTR_ERR(rq);
>
> - err = i915_gem_switch_to_kernel_context(i915);
> - if (err)
> - return err;
> -
> - for_each_engine_masked(engine, i915, engines, tmp) {
> - if (!engine_has_kernel_context_barrier(engine)) {
> - pr_err("kernel context not last on engine %s!\n",
> - engine->name);
> - return -EINVAL;
> + i915_request_add(rq);
> + }
> }
> - }
>
> - err = i915_gem_wait_for_idle(i915,
> - I915_WAIT_LOCKED,
> - MAX_SCHEDULE_TIMEOUT);
> - if (err)
> - return err;
> + err = i915_gem_switch_to_kernel_context(i915);
> + if (err)
> + return err;
>
> - GEM_BUG_ON(i915->gt.active_requests);
> - for_each_engine_masked(engine, i915, engines, tmp) {
> - if (engine->last_retired_context->gem_context != i915->kernel_context) {
> - pr_err("engine %s not idling in kernel context!\n",
> - engine->name);
> + if (!from_idle) {
> + err = i915_gem_wait_for_idle(i915,
> + I915_WAIT_LOCKED,
> + MAX_SCHEDULE_TIMEOUT);
> + if (err)
> + return err;
> + }
> +
> + if (i915->gt.active_requests) {
> + pr_err("%d active requests remain after switching to kernel context, pass %d (%s) on %s engine%s\n",
> + i915->gt.active_requests,
> + pass, from_idle ? "idle" : "busy",
> + __engine_name(i915, engines),
> + is_power_of_2(engines) ? "" : "s");
> return -EINVAL;
> }
> - }
>
> - err = i915_gem_switch_to_kernel_context(i915);
> - if (err)
> - return err;
> + /* XXX Bonus points for proving we are the kernel context! */
Before the patch intel_engine_has_kernel_context was used for this, why
not any more?
>
> - if (i915->gt.active_requests) {
> - pr_err("switch-to-kernel-context emitted %d requests even though it should already be idling in the kernel context\n",
> - i915->gt.active_requests);
> - return -EINVAL;
> + mutex_unlock(&i915->drm.struct_mutex);
> + drain_delayed_work(&i915->gt.idle_work);
> + mutex_lock(&i915->drm.struct_mutex);
> }
>
> - for_each_engine_masked(engine, i915, engines, tmp) {
> - if (!intel_engine_has_kernel_context(engine)) {
> - pr_err("kernel context not last on engine %s!\n",
> - engine->name);
> - return -EINVAL;
> - }
> - }
> + if (igt_flush_test(i915, I915_WAIT_LOCKED))
> + return -EIO;
>
> return 0;
> }
> @@ -1595,8 +1587,6 @@ static int igt_switch_to_kernel_context(void *arg)
>
> out_unlock:
> GEM_TRACE_DUMP_ON(err);
> - if (igt_flush_test(i915, I915_WAIT_LOCKED))
> - err = -EIO;
>
> intel_runtime_pm_put(i915, wakeref);
> mutex_unlock(&i915->drm.struct_mutex);
>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list