[Intel-gfx] [PATCH 1/4] drm/i915/selftests: Split preemption smoke test into threads
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Oct 1 13:16:25 UTC 2018
On 01/10/2018 13:32, Chris Wilson wrote:
> When submitting chains to each engine, we can do so (mostly) in
> parallel, so delegate submission to threads on a per-engine basis.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/selftests/intel_lrc.c | 73 ++++++++++++++++++----
> 1 file changed, 61 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> index 3a474bb64c05..d68a924c530e 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> @@ -587,8 +587,10 @@ static int random_priority(struct rnd_state *rnd)
> struct preempt_smoke {
> struct drm_i915_private *i915;
> struct i915_gem_context **contexts;
> + struct intel_engine_cs *engine;
> unsigned int ncontext;
> struct rnd_state prng;
> + unsigned long count;
> };
>
> static struct i915_gem_context *smoke_context(struct preempt_smoke *smoke)
> @@ -597,31 +599,78 @@ static struct i915_gem_context *smoke_context(struct preempt_smoke *smoke)
> &smoke->prng)];
> }
>
> +static int smoke_crescendo_thread(void *arg)
> +{
> + struct preempt_smoke *smoke = arg;
> + IGT_TIMEOUT(end_time);
> + unsigned long count;
> +
> + count = 0;
> + do {
> + struct i915_gem_context *ctx = smoke_context(smoke);
> + struct i915_request *rq;
> +
> + mutex_lock(&smoke->i915->drm.struct_mutex);
> +
> + ctx->sched.priority = count % I915_PRIORITY_MAX;
> +
> + rq = i915_request_alloc(smoke->engine, ctx);
> + if (IS_ERR(rq)) {
> + mutex_unlock(&smoke->i915->drm.struct_mutex);
> + return PTR_ERR(rq);
> + }
> +
> + i915_request_add(rq);
> +
> + mutex_unlock(&smoke->i915->drm.struct_mutex);
> +
> + count++;
> + } while (!__igt_timeout(end_time, NULL));
> +
> + smoke->count = count;
> + return 0;
> +}
> +
> static int smoke_crescendo(struct preempt_smoke *smoke)
> {
> + struct task_struct *tsk[I915_NUM_ENGINES] = {};
> + struct preempt_smoke arg[I915_NUM_ENGINES];
> struct intel_engine_cs *engine;
> enum intel_engine_id id;
> unsigned long count;
> + int err = 0;
> +
> + mutex_unlock(&smoke->i915->drm.struct_mutex);
>
> - count = 0;
> for_each_engine(engine, smoke->i915, id) {
> - IGT_TIMEOUT(end_time);
> + arg[id] = *smoke;
> + arg[id].engine = engine;
> + arg[id].count = 0;
> +
> + tsk[id] = kthread_run(smoke_crescendo_thread, &arg,
> + "igt/smoke:%d", id);
> + if (IS_ERR(tsk[id])) {
> + err = PTR_ERR(tsk[id]);
> + break;
> + }
> + }
>
> - do {
> - struct i915_gem_context *ctx = smoke_context(smoke);
> - struct i915_request *rq;
> + count = 0;
> + for_each_engine(engine, smoke->i915, id) {
> + int status;
>
> - ctx->sched.priority = count % I915_PRIORITY_MAX;
> + if (IS_ERR_OR_NULL(tsk[id]))
> + continue;
>
> - rq = i915_request_alloc(engine, ctx);
> - if (IS_ERR(rq))
> - return PTR_ERR(rq);
> + status = kthread_stop(tsk[id]);
> + if (status && !err)
> + err = status;
>
> - i915_request_add(rq);
> - count++;
> - } while (!__igt_timeout(end_time, NULL));
> + count += arg[id].count;
> }
>
> + mutex_lock(&smoke->i915->drm.struct_mutex);
> +
> pr_info("Submitted %lu crescendo requests across %d engines and %d contexts\n",
> count, INTEL_INFO(smoke->i915)->num_rings, smoke->ncontext);
> return 0;
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list