[igt-dev] [PATCH i-g-t 28/93] tests/i915/gem_exec_fair: Convert to intel_ctx_t

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Thu Jun 10 12:10:07 UTC 2021


On Wed, Jun 09, 2021 at 12:36:11PM -0500, Jason Ekstrand wrote:
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
>  tests/i915/gem_exec_fair.c | 112 +++++++++++++++++++++----------------
>  1 file changed, 65 insertions(+), 47 deletions(-)
> 
> diff --git a/tests/i915/gem_exec_fair.c b/tests/i915/gem_exec_fair.c
> index 628f4df2..7b53cc1f 100644
> --- a/tests/i915/gem_exec_fair.c
> +++ b/tests/i915/gem_exec_fair.c
> @@ -225,7 +225,7 @@ static void delay(int i915,
>  }
>  
>  static struct drm_i915_gem_exec_object2
> -delay_create(int i915, uint32_t ctx,
> +delay_create(int i915, const intel_ctx_t *ctx,
>  	     const struct intel_execution_engine2 *e,
>  	     uint64_t target_ns)
>  {
> @@ -236,7 +236,7 @@ delay_create(int i915, uint32_t ctx,
>  	struct drm_i915_gem_execbuffer2 execbuf = {
>  		.buffers_ptr = to_user_pointer(&obj),
>  		.buffer_count = 1,
> -		.rsvd1 = ctx,
> +		.rsvd1 = ctx->id,
>  		.flags = e->flags,
>  	};
>  
> @@ -326,7 +326,8 @@ static void tslog(int i915,
>  }
>  
>  static struct drm_i915_gem_exec_object2
> -tslog_create(int i915, uint32_t ctx, const struct intel_execution_engine2 *e)
> +tslog_create(int i915, const intel_ctx_t *ctx,
> +	     const struct intel_execution_engine2 *e)
>  {
>  	struct drm_i915_gem_exec_object2 obj = {
>  		.handle = batch_create(i915),
> @@ -335,7 +336,7 @@ tslog_create(int i915, uint32_t ctx, const struct intel_execution_engine2 *e)
>  	struct drm_i915_gem_execbuffer2 execbuf = {
>  		.buffers_ptr = to_user_pointer(&obj),
>  		.buffer_count = 1,
> -		.rsvd1 = ctx,
> +		.rsvd1 = ctx->id,
>  		.flags = e->flags,
>  	};
>  
> @@ -362,7 +363,8 @@ static int cmp_u32(const void *A, const void *B)
>  }
>  
>  static uint32_t
> -read_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
> +read_ctx_timestamp(int i915, const intel_ctx_t *ctx,
> +		   const struct intel_execution_engine2 *e)
>  {
>  	struct drm_i915_gem_relocation_entry reloc;
>  	struct drm_i915_gem_exec_object2 obj = {
> @@ -374,6 +376,7 @@ read_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
>  	struct drm_i915_gem_execbuffer2 execbuf = {
>  		.buffers_ptr = to_user_pointer(&obj),
>  		.buffer_count = 1,
> +		.rsvd1 = ctx->id,
>  		.flags = e->flags,
>  	};
>  	const int use_64b = intel_gen(intel_get_drm_devid(i915)) >= 8;
> @@ -415,23 +418,31 @@ read_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
>  	return ts;
>  }
>  
> -static bool has_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
> +static bool has_ctx_timestamp(int i915, const intel_ctx_cfg_t *cfg,
> +			      const struct intel_execution_engine2 *e)
>  {
>  	const int gen = intel_gen(intel_get_drm_devid(i915));
> +	const intel_ctx_t *tmp_ctx;
> +	uint32_t timestamp;
>  
>  	if (gen == 8 && e->class == I915_ENGINE_CLASS_VIDEO)
>  		return false; /* looks fubar */
>  
> -	return read_ctx_timestamp(i915, e);
> +	tmp_ctx = intel_ctx_create(i915, cfg);
> +	timestamp = read_ctx_timestamp(i915, tmp_ctx, e);
> +	intel_ctx_destroy(i915, tmp_ctx);
> +
> +	return timestamp;
>  }
>  
>  static struct intel_execution_engine2
> -pick_random_engine(int i915, const struct intel_execution_engine2 *not)
> +pick_random_engine(int i915, const intel_ctx_cfg_t *cfg,
> +		   const struct intel_execution_engine2 *not)
>  {
>  	const struct intel_execution_engine2 *e;
>  	unsigned int count = 0;
>  
> -	__for_each_physical_engine(i915, e) {
> +	for_each_ctx_cfg_engine(i915, cfg, e) {
>  		if (e->flags == not->flags)
>  			continue;
>  		if (!gem_class_has_mutable_submission(i915, e->class))
> @@ -442,7 +453,7 @@ pick_random_engine(int i915, const struct intel_execution_engine2 *not)
>  		return *not;
>  
>  	count = rand() % count;
> -	__for_each_physical_engine(i915, e) {
> +	for_each_ctx_cfg_engine(i915, cfg, e) {
>  		if (e->flags == not->flags)
>  			continue;
>  		if (!gem_class_has_mutable_submission(i915, e->class))
> @@ -454,7 +465,7 @@ pick_random_engine(int i915, const struct intel_execution_engine2 *not)
>  	return *e;
>  }
>  
> -static void fair_child(int i915, uint32_t ctx,
> +static void fair_child(int i915, const intel_ctx_t *ctx,
>  		       const struct intel_execution_engine2 *e,
>  		       uint64_t frame_ns,
>  		       int timeline,
> @@ -495,7 +506,7 @@ static void fair_child(int i915, uint32_t ctx,
>  
>  	srandom(getpid());
>  	if (flags & F_PING)
> -		ping = pick_random_engine(i915, e);
> +		ping = pick_random_engine(i915, &ctx->cfg, e);
>  	obj[0] = tslog_create(i915, ctx, &ping);
>  
>  	/* Synchronize with other children/parent upon construction */
> @@ -515,7 +526,7 @@ static void fair_child(int i915, uint32_t ctx,
>  		struct drm_i915_gem_execbuffer2 execbuf = {
>  			.buffers_ptr = to_user_pointer(obj),
>  			.buffer_count = 3,
> -			.rsvd1 = ctx,
> +			.rsvd1 = ctx->id,
>  			.rsvd2 = -1,
>  			.flags = aux_flags,
>  		};
> @@ -637,7 +648,7 @@ static void timeline_advance(int timeline, int delay_ns)
>  	sw_sync_timeline_inc(timeline, 1);
>  }
>  
> -static void fairness(int i915,
> +static void fairness(int i915, const intel_ctx_cfg_t *cfg,
>  		     const struct intel_execution_engine2 *e,
>  		     int duration, unsigned int flags)
>  {
> @@ -650,7 +661,7 @@ static void fairness(int i915,
>  		int parent[2];
>  	} lnk;
>  
> -	igt_require(has_ctx_timestamp(i915, e));
> +	igt_require(has_ctx_timestamp(i915, cfg, e));
>  	igt_require(gem_class_has_mutable_submission(i915, e->class));
>  	if (flags & (F_ISOLATE | F_PING))
>  		igt_require(intel_gen(intel_get_drm_devid(i915)) >= 8);
> @@ -714,12 +725,12 @@ static void fairness(int i915,
>  		if (flags & F_PING) { /* fill the others with light bg load */
>  			struct intel_execution_engine2 *ping;
>  
> -			__for_each_physical_engine(i915, ping) {
> +			for_each_ctx_cfg_engine(i915, cfg, ping) {
>  				if (ping->flags == e->flags)
>  					continue;
>  
>  				igt_fork(child, 1) {
> -					uint32_t ctx = gem_context_clone_with_engines(i915, 0);
> +					const intel_ctx_t *ctx = intel_ctx_create(i915, cfg);
>  
>  					fair_child(i915, ctx, ping,
>  						   child_ns / 8,
> @@ -728,7 +739,7 @@ static void fairness(int i915,
>  						   &result[nchild],
>  						   NULL, NULL, -1, -1);
>  
> -					gem_context_destroy(i915, ctx);
> +					intel_ctx_destroy(i915, ctx);
>  				}
>  			}
>  		}
> @@ -736,26 +747,24 @@ static void fairness(int i915,
>  		getrusage(RUSAGE_CHILDREN, &old_usage);
>  		igt_nsec_elapsed(memset(&tv, 0, sizeof(tv)));
>  		igt_fork(child, nchild) {
> -			uint32_t ctx;
> +			const intel_ctx_t *ctx;
>  
>  			if (flags & F_ISOLATE) {
> -				int clone, dmabuf = -1;
> +				int dmabuf = -1;
>  
>  				if (common)
>  					dmabuf = prime_handle_to_fd(i915, common);
>  
> -				clone = gem_reopen_driver(i915);
> -				gem_context_copy_engines(i915, 0, clone, 0);
> -				i915 = clone;
> +				i915 = gem_reopen_driver(i915);
>  
>  				if (dmabuf != -1)
>  					common = prime_fd_to_handle(i915, dmabuf);
>  			}
>  
> -			ctx = gem_context_clone_with_engines(i915, 0);
> +			ctx = intel_ctx_create(i915, cfg);
>  
>  			if (flags & F_VIP && child == 0) {
> -				gem_context_set_priority(i915, ctx, 1023);
> +				gem_context_set_priority(i915, ctx->id, 1023);
>  				flags |= F_FLOW;
>  			}
>  			if (flags & F_RRUL && child == 0)
> @@ -767,7 +776,7 @@ static void fairness(int i915,
>  				   &result[child], &iqr[child],
>  				   lnk.child[1], lnk.parent[0]);
>  
> -			gem_context_destroy(i915, ctx);
> +			intel_ctx_destroy(i915, ctx);
>  		}
>  
>  		{
> @@ -912,7 +921,7 @@ static void fairness(int i915,
>  }
>  
>  static void deadline_child(int i915,
> -			   uint32_t ctx,
> +			   const intel_ctx_t *ctx,
>  			   const struct intel_execution_engine2 *e,
>  			   uint32_t handle,
>  			   int timeline,
> @@ -932,7 +941,7 @@ static void deadline_child(int i915,
>  		.buffers_ptr = to_user_pointer(obj),
>  		.buffer_count = ARRAY_SIZE(obj),
>  		.flags = I915_EXEC_FENCE_OUT | e->flags,
> -		.rsvd1 = ctx,
> +		.rsvd1 = ctx->id,
>  	};
>  	unsigned int seq = 1;
>  	int prev = -1, next = -1;
> @@ -977,11 +986,12 @@ static void deadline_child(int i915,
>  	close(prev);
>  }
>  
> -static struct intel_execution_engine2 pick_default(int i915)
> +static struct intel_execution_engine2
> +pick_default(int i915, const intel_ctx_cfg_t *cfg)
>  {
>  	const struct intel_execution_engine2 *e;
>  
> -	__for_each_physical_engine(i915, e) {
> +	for_each_ctx_cfg_engine(i915, cfg, e) {
>  		if (!e->flags)
>  			return *e;
>  	}
> @@ -989,11 +999,12 @@ static struct intel_execution_engine2 pick_default(int i915)
>  	return (struct intel_execution_engine2){};
>  }
>  
> -static struct intel_execution_engine2 pick_engine(int i915, const char *name)
> +static struct intel_execution_engine2
> +pick_engine(int i915, const intel_ctx_cfg_t *cfg, const char *name)
>  {
>  	const struct intel_execution_engine2 *e;
>  
> -	__for_each_physical_engine(i915, e) {
> +	for_each_ctx_cfg_engine(i915, cfg, e) {
>  		if (!strcmp(e->name, name))
>  			return *e;
>  	}
> @@ -1030,15 +1041,16 @@ static uint64_t time_get_mono_ns(void)
>  	return tv.tv_sec * NSEC64 + tv.tv_nsec;
>  }
>  
> -static void deadline(int i915, int duration, unsigned int flags)
> +static void deadline(int i915, const intel_ctx_cfg_t *cfg,
> +		     int duration, unsigned int flags)
>  {
>  	const int64_t frame_ns = 33670 * 1000; /* 29.7fps */
>  	const int64_t parent_ns = 400 * 1000;
>  	const int64_t switch_ns = 50 * 1000;
>  	const int64_t overhead_ns = /* estimate timeslicing overhead */
>  		(frame_ns / 1000 / 1000 + 2) * switch_ns + parent_ns;
> -	struct intel_execution_engine2 pe = pick_default(i915);
> -	struct intel_execution_engine2 ve = pick_engine(i915, "vcs0");
> +	struct intel_execution_engine2 pe = pick_default(i915, cfg);
> +	struct intel_execution_engine2 ve = pick_engine(i915, cfg, "vcs0");
>  	struct drm_i915_gem_exec_fence *fences = calloc(sizeof(*fences), 32);
>  	struct drm_i915_gem_exec_object2 *obj = calloc(sizeof(*obj), 32);
>  	struct drm_i915_gem_execbuffer2 execbuf = {
> @@ -1049,14 +1061,15 @@ static void deadline(int i915, int duration, unsigned int flags)
>  			I915_EXEC_FENCE_ARRAY |
>  			I915_EXEC_FENCE_OUT
>  	};
> +	const intel_ctx_t *delay_ctx;
>  	int *ctl;
>  
>  	igt_require(has_syncobj(i915));
>  	igt_require(has_fence_array(i915));
>  	igt_require(has_mi_math(i915, &pe));
> -	igt_require(has_ctx_timestamp(i915, &pe));
> +	igt_require(has_ctx_timestamp(i915, cfg, &pe));
>  	igt_require(has_mi_math(i915, &ve));
> -	igt_require(has_ctx_timestamp(i915, &ve));
> +	igt_require(has_ctx_timestamp(i915, cfg, &ve));
>  	igt_assert(obj && fences);
>  	if (flags & DL_PRIO)
>  		igt_require(gem_scheduler_has_preemption(i915));
> @@ -1064,9 +1077,10 @@ static void deadline(int i915, int duration, unsigned int flags)
>  	ctl = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
>  	igt_assert(ctl != MAP_FAILED);
>  
> -	obj[0] = delay_create(i915, 0, &pe, parent_ns);
> +	delay_ctx = intel_ctx_create(i915, cfg);
> +	obj[0] = delay_create(i915, delay_ctx, &pe, parent_ns);
>  	if (flags & DL_PRIO)
> -		gem_context_set_priority(i915, 0, 1023);
> +		gem_context_set_priority(i915, delay_ctx->id, 1023);
>  	if (intel_gen(intel_get_drm_devid(i915)) < 8)
>  		execbuf.flags |= I915_EXEC_SECURE;
>  	for (int n = 1; n <= 5; n++) {
> @@ -1093,7 +1107,7 @@ static void deadline(int i915, int duration, unsigned int flags)
>  
>  		*ctl = 0;
>  		igt_fork(child, num_children) {
> -			uint32_t ctx = gem_context_clone_with_engines(i915, 0);
> +			const intel_ctx_t *ctx = intel_ctx_create(i915, cfg);
>  
>  			deadline_child(i915, ctx, &ve, obj[child + 1].handle,
>  				       timeline, child_ns,
> @@ -1101,7 +1115,7 @@ static void deadline(int i915, int duration, unsigned int flags)
>  				       link[child].parent[0],
>  				       ctl, flags);
>  
> -			gem_context_destroy(i915, ctx);
> +			intel_ctx_destroy(i915, ctx);
>  		}
>  
>  		for (int i = 0; i < num_children; i++)
> @@ -1175,6 +1189,7 @@ static void deadline(int i915, int duration, unsigned int flags)
>  		gem_quiescent_gpu(i915);
>  	}
>  
> +	intel_ctx_destroy(i915, delay_ctx);
>  	gem_close(i915, obj[0].handle);
>  	free(obj);
>  	free(fences);
> @@ -1282,6 +1297,7 @@ igt_main
>  		{}
>  	};
>  	const struct intel_execution_engine2 *e;
> +	intel_ctx_cfg_t cfg;
>  	int i915 = -1;
>  
>  	igt_fixture {
> @@ -1297,6 +1313,8 @@ igt_main
>  		igt_require(gem_scheduler_enabled(i915));
>  		igt_require(gem_scheduler_has_ctx_priority(i915));
>  
> +		cfg = intel_ctx_cfg_all_physical(i915);
> +
>  		igt_info("CS timestamp frequency: %d\n",
>  			 read_timestamp_frequency(i915));
>  		igt_require(has_mi_math(i915, NULL));
> @@ -1310,7 +1328,7 @@ igt_main
>  			continue;
>  
>  		igt_subtest_with_dynamic_f("basic-%s", f->name)  {
> -			__for_each_physical_engine(i915, e) {
> +			for_each_ctx_cfg_engine(i915, &cfg, e) {
>  				if (!has_mi_math(i915, e))
>  					continue;
>  
> @@ -1321,19 +1339,19 @@ igt_main
>  					continue;
>  
>  				igt_dynamic_f("%s", e->name)
> -					fairness(i915, e, 1, f->flags);
> +					fairness(i915, &cfg, e, 1, f->flags);
>  			}
>  		}
>  	}
>  
>  	igt_subtest("basic-deadline")
> -		deadline(i915, 2, 0);
> +		deadline(i915, &cfg, 2, 0);
>  	igt_subtest("deadline-prio")
> -		deadline(i915, 2, DL_PRIO);
> +		deadline(i915, &cfg, 2, DL_PRIO);
>  
>  	for (typeof(*fair) *f = fair; f->name; f++) {
>  		igt_subtest_with_dynamic_f("fair-%s", f->name)  {
> -			__for_each_physical_engine(i915, e) {
> +			for_each_ctx_cfg_engine(i915, &cfg, e) {
>  				if (!has_mi_math(i915, e))
>  					continue;
>  
> @@ -1344,7 +1362,7 @@ igt_main
>  					continue;
>  
>  				igt_dynamic_f("%s", e->name)
> -					fairness(i915, e, 5, f->flags);
> +					fairness(i915, &cfg, e, 5, f->flags);
>  			}
>  		}
>  	}
> -- 
> 2.31.1

The only potentially important difference was to check supporting
ctx_timestamp. Original code uses ctx0 so it left that counter 
bumped by the check. Your code uses separate context for that but
it seems not important here. Thus:

Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>

--
Zbigniew

> 
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev


More information about the igt-dev mailing list