[Intel-gfx] [PATCH 2/3] drm/i915/selftests: Disable heartbeat around context barrier tests
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Fri Nov 15 16:15:56 UTC 2019
On 15/11/2019 15:08, Chris Wilson wrote:
> As the heartbeat has the effect of flushing context barriers, this
> interferes with the context barrier tests that are trying to observe
> them directly. Disable the heartbeat so that the barriers are as
> predictable as the test demands.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/gt/selftest_context.c | 44 +++++++++++++++++++---
> 1 file changed, 38 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/selftest_context.c b/drivers/gpu/drm/i915/gt/selftest_context.c
> index 14ba6ceb9177..3586af636304 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_context.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_context.c
> @@ -5,6 +5,7 @@
> */
>
> #include "i915_selftest.h"
> +#include "intel_engine_heartbeat.h"
> #include "intel_engine_pm.h"
> #include "intel_gt.h"
>
> @@ -200,6 +201,7 @@ static int live_context_size(void *arg)
> static int __live_active_context(struct intel_engine_cs *engine,
> struct i915_gem_context *fixme)
> {
> + unsigned long saved_heartbeat;
> struct intel_context *ce;
> int pass;
> int err;
> @@ -227,36 +229,50 @@ static int __live_active_context(struct intel_engine_cs *engine,
> if (IS_ERR(ce))
> return PTR_ERR(ce);
>
> + saved_heartbeat = engine->props.heartbeat_interval_ms;
> + engine->props.heartbeat_interval_ms = 0;
> +
> for (pass = 0; pass <= 2; pass++) {
> struct i915_request *rq;
>
> + intel_engine_pm_get(engine);
> +
> rq = intel_context_create_request(ce);
> if (IS_ERR(rq)) {
> err = PTR_ERR(rq);
> - goto err;
> + goto out_engine;
> }
>
> err = request_sync(rq);
> if (err)
> - goto err;
> + goto out_engine;
>
> /* Context will be kept active until after an idle-barrier. */
> if (i915_active_is_idle(&ce->active)) {
> pr_err("context is not active; expected idle-barrier (%s pass %d)\n",
> engine->name, pass);
> err = -EINVAL;
> - goto err;
> + goto out_engine;
> }
>
> if (!intel_engine_pm_is_awake(engine)) {
> pr_err("%s is asleep before idle-barrier\n",
> engine->name);
> err = -EINVAL;
> - goto err;
> + goto out_engine;
> }
> +
> +out_engine:
> + intel_engine_pm_put(engine);
> + if (err)
> + goto err;
> }
>
> /* Now make sure our idle-barriers are flushed */
> + err = intel_engine_flush_barriers(engine);
> + if (err)
> + goto err;
> +
> err = context_sync(engine->kernel_context);
> if (err)
> goto err;
> @@ -270,8 +286,9 @@ static int __live_active_context(struct intel_engine_cs *engine,
> struct drm_printer p = drm_debug_printer(__func__);
>
> intel_engine_dump(engine, &p,
> - "%s is still awake after idle-barriers\n",
> - engine->name);
> + "%s is still awake:%d after idle-barriers\n",
> + engine->name,
> + atomic_read(&engine->wakeref.count));
> GEM_TRACE_DUMP();
>
> err = -EINVAL;
> @@ -279,6 +296,7 @@ static int __live_active_context(struct intel_engine_cs *engine,
> }
>
> err:
> + engine->props.heartbeat_interval_ms = saved_heartbeat;
> intel_context_put(ce);
> return err;
> }
> @@ -349,6 +367,7 @@ static int __live_remote_context(struct intel_engine_cs *engine,
> struct i915_gem_context *fixme)
> {
> struct intel_context *local, *remote;
> + unsigned long saved_heartbeat;
> int pass;
> int err;
>
> @@ -360,6 +379,12 @@ static int __live_remote_context(struct intel_engine_cs *engine,
> * clobber the idle-barrier.
> */
>
> + if (intel_engine_pm_is_awake(engine)) {
> + pr_err("%s is awake before starting %s!\n",
> + engine->name, __func__);
> + return -EINVAL;
> + }
> +
> remote = intel_context_create(fixme, engine);
> if (IS_ERR(remote))
> return PTR_ERR(remote);
> @@ -370,6 +395,10 @@ static int __live_remote_context(struct intel_engine_cs *engine,
> goto err_remote;
> }
>
> + saved_heartbeat = engine->props.heartbeat_interval_ms;
> + engine->props.heartbeat_interval_ms = 0;
> + intel_engine_pm_get(engine);
> +
> for (pass = 0; pass <= 2; pass++) {
> err = __remote_sync(local, remote);
> if (err)
> @@ -387,6 +416,9 @@ static int __live_remote_context(struct intel_engine_cs *engine,
> }
> }
>
> + intel_engine_pm_put(engine);
> + engine->props.heartbeat_interval_ms = saved_heartbeat;
> +
> intel_context_put(local);
> err_remote:
> intel_context_put(remote);
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list