[igt-dev] [PATCH i-g-t 12/79] tests/i915/gem_exec_fair: Convert to intel_ctx_t
Jason Ekstrand
jason at jlekstrand.net
Thu Jun 17 19:12:19 UTC 2021
Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
---
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 628f4df22..7b53cc1f4 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
More information about the igt-dev
mailing list