[igt-dev] [PATCH i-g-t 1/1] tests/i915/gem_ctx_persistence: Set context with supported engines

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Jan 10 10:56:59 UTC 2020


These were my suggestions so I'll reply. :)

On 09/01/2020 09:18, Chris Wilson wrote:
> Quoting Bommu Krishnaiah (2020-01-09 08:50:23)
>> Update the context with supported engines on the platform with set_property
>> I915_CONTEXT_PARAM_ENGINES to make sure the work load is submitted to
>> the available engines only.
>>
>> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>> Signed-off-by: Bommu Krishnaiah <krishnaiah.bommu at intel.com>
>> ---
>>   tests/i915/gem_ctx_persistence.c | 34 ++++++++++++++++++--------------
>>   1 file changed, 19 insertions(+), 15 deletions(-)
>>
>> diff --git a/tests/i915/gem_ctx_persistence.c b/tests/i915/gem_ctx_persistence.c
>> index d68431ae..e410e85f 100644
>> --- a/tests/i915/gem_ctx_persistence.c
>> +++ b/tests/i915/gem_ctx_persistence.c
>> @@ -145,6 +145,15 @@ static void test_clone(int i915)
>>          gem_context_destroy(i915, clone);
>>   }
>>   
>> +static uint32_t create_context(int i915, bool persistent)
>> +{
>> +       uint32_t ctx;
>> +
>> +       ctx = gem_context_create(i915);
>> +       gem_context_set_persistence(i915, ctx, persistent);
>> +       gem_context_set_all_engines(i915, ctx);
> 
> Really? We only need a single engine, could you not be a little more
> precise.

We have a general situation where as soon as we call 
__for_each_physical_engine, all code/subtests that follow and which 
create new contexts, which are then submitted mixing the flags from the 
iterated engines, needs to have a matching engine map. This stateful 
behaviour causes problems but it's what we have. I don't have any better 
ideas on how to universally go about this.

> 
>> +       return ctx;
>> +}
>>   static void test_persistence(int i915, unsigned int engine)
>>   {
>>          igt_spin_t *spin;
>> @@ -156,8 +165,7 @@ static void test_persistence(int i915, unsigned int engine)
>>           * request is retired -- no early termination.
>>           */
>>   
>> -       ctx = gem_context_create(i915);
>> -       gem_context_set_persistence(i915, ctx, true);
>> +       ctx = create_context(i915, true);
>>   
>>          spin = igt_spin_new(i915, ctx,
>>                              .engine = engine,
>> @@ -188,8 +196,7 @@ static void test_nonpersistent_cleanup(int i915, unsigned int engine)
>>           * any inflight request is cancelled.
>>           */
>>   
>> -       ctx = gem_context_create(i915);
>> -       gem_context_set_persistence(i915, ctx, false);
>> +       ctx = create_context(i915, false);
>>   
>>          spin = igt_spin_new(i915, ctx,
>>                              .engine = engine,
>> @@ -217,8 +224,7 @@ static void test_nonpersistent_mixed(int i915, unsigned int engine)
>>                  igt_spin_t *spin;
>>                  uint32_t ctx;
>>   
>> -               ctx = gem_context_create(i915);
>> -               gem_context_set_persistence(i915, ctx, i & 1);
>> +               ctx = create_context(i915, i & 1);
>>   
>>                  spin = igt_spin_new(i915, ctx,
>>                                      .engine = engine,
>> @@ -253,8 +259,7 @@ static void test_nonpersistent_hostile(int i915, unsigned int engine)
>>           * the requests and cleanup the context.
>>           */
>>   
>> -       ctx = gem_context_create(i915);
>> -       gem_context_set_persistence(i915, ctx, false);
>> +       ctx = create_context(i915, false);
>>   
>>          spin = igt_spin_new(i915, ctx,
>>                              .engine = engine,
>> @@ -284,8 +289,8 @@ static void test_nonpersistent_hostile_preempt(int i915, unsigned int engine)
>>   
>>          igt_require(gem_scheduler_has_preemption(i915));
>>   
>> -       ctx = gem_context_create(i915);
>> -       gem_context_set_persistence(i915, ctx, true);
>> +       ctx = create_context(i915, true);
>> +
>>          gem_context_set_priority(i915, ctx, 0);
>>          spin[0] = igt_spin_new(i915, ctx,
>>                                 .engine = engine,
>> @@ -385,8 +390,8 @@ static void test_nonpersistent_queued(int i915, unsigned int engine)
>>   
>>          gem_quiescent_gpu(i915);
>>   
>> -       ctx = gem_context_create(i915);
>> -       gem_context_set_persistence(i915, ctx, false);
>> +       ctx = create_context(i915, false);
>> +
>>          spin = igt_spin_new(i915, ctx,
>>                              .engine = engine,
>>                              .flags = IGT_SPIN_FENCE_OUT);
>> @@ -512,8 +517,7 @@ static void test_process_mixed(int i915, unsigned int engine)
>>                          igt_spin_t *spin;
>>                          uint32_t ctx;
>>   
>> -                       ctx = gem_context_create(i915);
>> -                       gem_context_set_persistence(i915, ctx, persists);
>> +                       ctx = create_context(i915, persists);
>>   
>>                          spin = igt_spin_new(i915, ctx,
>>                                              .engine = engine,
>> @@ -727,7 +731,7 @@ igt_main
>>          igt_subtest("hangcheck")
>>                  test_nohangcheck_hostile(i915);
>>   
>> -       __for_each_static_engine(e) {
>> +       __for_each_physical_engine(i915, e) {
> 
> Please note this has to check ABI. We have to confirm that no matter how
> the user tries to fool us, they cannot. So the gem_context_set_engines()
> should be considered a separate step, or a very, very persuasive
> argument made as to why we consider the multiple ABI paths equivalent,
> bearing in mind the security implications of getting it wrong.

So duplicate the subtest loop, first do ABI, then physical?

for_each_engine(..) {
	...

	igt_subtest_f("legacy-%s-persistence")
		test_persistence(..)
	...
}

__for_each_physical_engine(..) {
	...

	igt_subtest_f("%s-persistence")
		test_persistence(..)
	...
}

Then in create_context helper we need to query the default context ( 
gem_context_has_engine_map) to establish if we need to call 
gem_context_set_all_engines or not.

Acceptable?

Regards,

Tvrtko


More information about the igt-dev mailing list