Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [CI 07/14] drm/i915/selftests: Exercise priority inheritance around an engine loop
Date: Tue, 2 Feb 2021 16:44:26 +0000	[thread overview]
Message-ID: <8a718e4d-ec77-5829-e4c5-d29981731239@linux.intel.com> (raw)
In-Reply-To: <20210202151445.20002-7-chris@chris-wilson.co.uk>


On 02/02/2021 15:14, Chris Wilson wrote:
> Exercise rescheduling priority inheritance around a sequence of requests
> that wrap around all the engines.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   .../gpu/drm/i915/selftests/i915_scheduler.c   | 225 ++++++++++++++++++
>   1 file changed, 225 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/selftests/i915_scheduler.c b/drivers/gpu/drm/i915/selftests/i915_scheduler.c
> index d095fab2ccec..acc666f755d7 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_scheduler.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_scheduler.c
> @@ -7,6 +7,7 @@
>   
>   #include "gt/intel_context.h"
>   #include "gt/intel_gpu_commands.h"
> +#include "gt/intel_ring.h"
>   #include "gt/selftest_engine_heartbeat.h"
>   #include "selftests/igt_spinner.h"
>   #include "selftests/i915_random.h"
> @@ -504,10 +505,234 @@ static int igt_priority_chains(void *arg)
>   	return igt_schedule_chains(arg, igt_priority);
>   }
>   
> +static struct i915_request *
> +__write_timestamp(struct intel_engine_cs *engine,
> +		  struct drm_i915_gem_object *obj,
> +		  int slot,
> +		  struct i915_request *prev)
> +{
> +	struct i915_request *rq = ERR_PTR(-EINVAL);
> +	bool use_64b = INTEL_GEN(engine->i915) >= 8;
> +	struct intel_context *ce;
> +	struct i915_vma *vma;
> +	int err = 0;
> +	u32 *cs;
> +
> +	ce = intel_context_create(engine);
> +	if (IS_ERR(ce))
> +		return ERR_CAST(ce);
> +
> +	vma = i915_vma_instance(obj, ce->vm, NULL);
> +	if (IS_ERR(vma)) {
> +		err = PTR_ERR(vma);
> +		goto out_ce;
> +	}
> +
> +	err = i915_vma_pin(vma, 0, 0, PIN_USER);
> +	if (err)
> +		goto out_ce;
> +
> +	rq = intel_context_create_request(ce);
> +	if (IS_ERR(rq)) {
> +		err = PTR_ERR(rq);
> +		goto out_unpin;
> +	}
> +
> +	i915_vma_lock(vma);
> +	err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
> +	i915_vma_unlock(vma);
> +	if (err)
> +		goto out_request;
> +
> +	if (prev) {
> +		err = i915_request_await_dma_fence(rq, &prev->fence);
> +		if (err)
> +			goto out_request;
> +	}
> +
> +	if (engine->emit_init_breadcrumb) {
> +		err = engine->emit_init_breadcrumb(rq);
> +		if (err)
> +			goto out_request;
> +	}
> +
> +	cs = intel_ring_begin(rq, 4);
> +	if (IS_ERR(cs)) {
> +		err = PTR_ERR(cs);
> +		goto out_request;
> +	}
> +
> +	*cs++ = MI_STORE_REGISTER_MEM + use_64b;
> +	*cs++ = i915_mmio_reg_offset(RING_TIMESTAMP(engine->mmio_base));
> +	*cs++ = lower_32_bits(vma->node.start) + sizeof(u32) * slot;
> +	*cs++ = upper_32_bits(vma->node.start);
> +	intel_ring_advance(rq, cs);
> +
> +	i915_request_get(rq);
> +out_request:
> +	i915_request_add(rq);
> +out_unpin:
> +	i915_vma_unpin(vma);
> +out_ce:
> +	intel_context_put(ce);
> +	i915_request_put(prev);
> +	return err ? ERR_PTR(err) : rq;
> +}
> +
> +static struct i915_request *create_spinner(struct drm_i915_private *i915,
> +					   struct igt_spinner *spin)
> +{
> +	struct intel_engine_cs *engine;
> +
> +	for_each_uabi_engine(engine, i915) {
> +		struct intel_context *ce;
> +		struct i915_request *rq;
> +
> +		if (igt_spinner_init(spin, engine->gt))
> +			return ERR_PTR(-ENOMEM);
> +
> +		ce = intel_context_create(engine);
> +		if (IS_ERR(ce))
> +			return ERR_CAST(ce);
> +
> +		rq = igt_spinner_create_request(spin, ce, MI_NOOP);
> +		intel_context_put(ce);
> +		if (rq == ERR_PTR(-ENODEV))
> +			continue;
> +		if (IS_ERR(rq))
> +			return rq;
> +
> +		i915_request_get(rq);
> +		i915_request_add(rq);
> +		return rq;
> +	}
> +
> +	return ERR_PTR(-ENODEV);
> +}
> +
> +static bool has_timestamp(const struct drm_i915_private *i915)
> +{
> +	return INTEL_GEN(i915) >= 7;
> +}
> +
> +static int __igt_schedule_cycle(struct drm_i915_private *i915,
> +				bool (*fn)(struct i915_request *rq,
> +					   unsigned long v, unsigned long e))
> +{
> +	struct intel_engine_cs *engine;
> +	struct drm_i915_gem_object *obj;
> +	struct igt_spinner spin;
> +	struct i915_request *rq;
> +	unsigned long count, n;
> +	u32 *time, last;
> +	int err;
> +
> +	/*
> +	 * Queue a bunch of ordered requests (each waiting on the previous)
> +	 * around the engines a couple of times. Each request will write
> +	 * the timestamp it executes at into the scratch, with the expectation
> +	 * that the timestamp will be in our desired execution order.
> +	 */
> +
> +	if (!i915->caps.scheduler || !has_timestamp(i915))
> +		return 0;
> +
> +	obj = i915_gem_object_create_internal(i915, SZ_64K);
> +	if (IS_ERR(obj))
> +		return PTR_ERR(obj);
> +
> +	time = i915_gem_object_pin_map(obj, I915_MAP_WC);
> +	if (IS_ERR(time)) {
> +		err = PTR_ERR(time);
> +		goto out_obj;
> +	}
> +
> +	rq = create_spinner(i915, &spin);
> +	if (IS_ERR(rq)) {
> +		err = PTR_ERR(rq);
> +		goto out_obj;
> +	}
> +
> +	err = 0;
> +	count = 0;
> +	for_each_uabi_engine(engine, i915) {
> +		if (!intel_engine_has_scheduler(engine))
> +			continue;
> +
> +		rq = __write_timestamp(engine, obj, count, rq);
> +		if (IS_ERR(rq)) {
> +			err = PTR_ERR(rq);
> +			break;
> +		}
> +
> +		count++;
> +	}

^^^^ vvvv - two of the same by copy&paste error or couldn't be bothered 
with outer loop?

> +	for_each_uabi_engine(engine, i915) {
> +		if (!intel_engine_has_scheduler(engine))
> +			continue;
> +
> +		rq = __write_timestamp(engine, obj, count, rq);
> +		if (IS_ERR(rq)) {
> +			err = PTR_ERR(rq);
> +			break;
> +		}
> +
> +		count++;
> +	}
> +	GEM_BUG_ON(count * sizeof(u32) > obj->base.size);
> +	if (err || !count)
> +		goto out_spin;
> +
> +	fn(rq, count + 1, count);
> +	igt_spinner_end(&spin);
> +
> +	if (i915_request_wait(rq, 0, HZ / 2) < 0) {
> +		err = -ETIME;
> +		goto out_request;
> +	}
> +
> +	last = time[0];
> +	for (n = 1; n < count; n++) {
> +		if (i915_seqno_passed(last, time[n])) {
> +			pr_err("Timestamp[%lu] %x before previous %x\n",
> +			       n, time[n], last);
> +			err = -EINVAL;
> +			break;
> +		}
> +		last = time[n];
> +	}
> +
> +out_request:
> +	i915_request_put(rq);
> +out_spin:
> +	igt_spinner_fini(&spin);
> +out_obj:
> +	i915_gem_object_put(obj);
> +	return err;
> +}
> +
> +static bool noop(struct i915_request *rq, unsigned long v, unsigned long e)
> +{
> +	return true;
> +}
> +
> +static int igt_schedule_cycle(void *arg)
> +{
> +	return __igt_schedule_cycle(arg, noop);
> +}
> +
> +static int igt_priority_cycle(void *arg)
> +{
> +	return __igt_schedule_cycle(arg, igt_priority);
> +}
> +
>   int i915_scheduler_live_selftests(struct drm_i915_private *i915)
>   {
>   	static const struct i915_subtest tests[] = {
>   		SUBTEST(igt_priority_chains),
> +
> +		SUBTEST(igt_schedule_cycle),
> +		SUBTEST(igt_priority_cycle),
>   	};
>   
>   	return i915_subtests(tests, i915);
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2021-02-02 16:44 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-02 15:14 [Intel-gfx] [CI 01/14] drm/i915/gt: Move engine setup out of set_default_submission Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 02/14] drm/i915/gt: Move submission_method into intel_gt Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 03/14] drm/i915/gt: Move CS interrupt handler to the backend Chris Wilson
2021-02-02 15:49   ` Tvrtko Ursulin
2021-02-02 15:53     ` Chris Wilson
2021-02-02 16:08       ` Chris Wilson
2021-02-02 16:15   ` [Intel-gfx] [PATCH v2] " Chris Wilson
2021-02-02 16:33     ` Tvrtko Ursulin
2021-02-02 15:14 ` [Intel-gfx] [CI 04/14] drm/i915: Replace engine->schedule() with a known request operation Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 05/14] drm/i915: Restructure priority inheritance Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 06/14] drm/i915/selftests: Measure set-priority duration Chris Wilson
2021-02-02 16:49   ` Tvrtko Ursulin
2021-02-02 15:14 ` [Intel-gfx] [CI 07/14] drm/i915/selftests: Exercise priority inheritance around an engine loop Chris Wilson
2021-02-02 16:44   ` Tvrtko Ursulin [this message]
2021-02-02 17:22     ` Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 08/14] drm/i915/selftests: Force a rewind if at first we don't succeed Chris Wilson
2021-02-02 16:52   ` Tvrtko Ursulin
2021-02-02 17:43     ` Chris Wilson
2021-02-02 21:14       ` Chris Wilson
2021-02-02 21:24         ` Chris Wilson
2021-02-02 21:32           ` Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 09/14] drm/i915: Improve DFS for priority inheritance Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 10/14] drm/i915: Extract request submission from execlists Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 11/14] drm/i915: Extract request rewinding " Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 12/14] drm/i915: Extract request suspension from the execlists Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 13/14] drm/i915: Extract the ability to defer and rerun a request later Chris Wilson
2021-02-02 15:14 ` [Intel-gfx] [CI 14/14] drm/i915: Fix the iterative dfs for defering requests Chris Wilson
2021-02-02 18:37 ` [Intel-gfx] ✗ Fi.CI.BUILD: failure for series starting with [CI,01/14] drm/i915/gt: Move engine setup out of set_default_submission (rev2) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8a718e4d-ec77-5829-e4c5-d29981731239@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox