[PATCH i-g-t 1/2] tests/intel/xe_drm_fdinfo: Group utilization tests and skip when no utilization data

Bernatowicz, Marcin marcin.bernatowicz at linux.intel.com
Thu Mar 6 09:19:37 UTC 2025



On 3/5/2025 6:08 PM, Lucas De Marchi wrote:
> On Tue, Mar 04, 2025 at 07:56:39PM +0100, Marcin Bernatowicz wrote:
>> Wrap all utilization-related subtests in an igt_subtest_group and add
>> a fixture that ensures utilization data is available before running
>> them.
>>
>> Link: https://lore.kernel.org/r/20250205191644.2550879-1- 
>> marcin.bernatowicz at linux.intel.com
>>
>> Signed-off-by: Marcin Bernatowicz <marcin.bernatowicz at linux.intel.com>
>> Cc: Jakub Kolakowski <jakub1.kolakowski at intel.com>
>> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>> Cc: Lukasz Laguna <lukasz.laguna at intel.com>
>> Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>
>> ---
>> tests/intel/xe_drm_fdinfo.c | 122 ++++++++++++++++++++----------------
>> 1 file changed, 67 insertions(+), 55 deletions(-)
>>
>> diff --git a/tests/intel/xe_drm_fdinfo.c b/tests/intel/xe_drm_fdinfo.c
>> index 7330b4330..d18fe10d8 100644
>> --- a/tests/intel/xe_drm_fdinfo.c
>> +++ b/tests/intel/xe_drm_fdinfo.c
>> @@ -735,10 +735,6 @@ igt_main
>>     igt_subtest("basic-mem")
>>         basic_memory(xe);
>>
>> -    igt_describe("Check if basic fdinfo content is present for engine 
>> utilization");
>> -    igt_subtest("basic-utilization")
>> -        basic_engine_utilization(xe);
>> -
>>     igt_describe("Create and compare total and resident memory 
>> consumption by client");
>>     igt_subtest("mem-total-resident")
>>         mem_total_resident(xe);
>> @@ -751,57 +747,73 @@ igt_main
>>     igt_subtest("mem-active")
>>         mem_active(xe, xe_engine(xe, 0));
>>
>> -    igt_subtest("utilization-single-idle")
>> -        xe_for_each_engine(xe, hwe)
>> -            utilization_single(xe, hwe, 0);
>> -
>> -    igt_subtest("utilization-single-full-load")
>> -        xe_for_each_engine(xe, hwe)
>> -            utilization_single(xe, hwe, TEST_BUSY | TEST_TRAILING_IDLE);
>> -
>> -    igt_subtest("utilization-single-full-load-isolation")
>> -        xe_for_each_engine(xe, hwe)
>> -            utilization_single(xe, hwe, TEST_BUSY | 
>> TEST_TRAILING_IDLE | TEST_ISOLATION);
>> -
>> -    igt_subtest("utilization-single-full-load-destroy-queue")
>> -        xe_for_each_engine(xe, hwe)
>> -            utilization_single_destroy_queue(xe, hwe);
>> -
>> -    igt_subtest("utilization-others-idle")
>> -        xe_for_each_engine(xe, hwe)
>> -            utilization_others_idle(xe, hwe);
>> -
>> -    igt_subtest("utilization-others-full-load")
>> -        xe_for_each_engine(xe, hwe)
>> -            utilization_others_full_load(xe, hwe);
>> -
>> -    igt_subtest("utilization-all-full-load")
>> -        utilization_all_full_load(xe);
>> -
>> -
>> -    for (const struct section *s = sections; s->name; s++) {
>> -        igt_subtest_f("%s-utilization-single-idle", s->name)
>> -            xe_for_each_gt(xe, gt)
>> -                xe_for_each_engine_class(class)
>> -                    utilization_multi(xe, gt, class, s->flags);
>> -
>> -        igt_subtest_f("%s-utilization-single-full-load", s->name)
>> -            xe_for_each_gt(xe, gt)
>> -                xe_for_each_engine_class(class)
>> -                    utilization_multi(xe, gt, class,
>> -                              s->flags |
>> -                              TEST_BUSY |
>> -                              TEST_TRAILING_IDLE);
>> -
>> -        igt_subtest_f("%s-utilization-single-full-load-isolation",
>> -                  s->name)
>> -            xe_for_each_gt(xe, gt)
>> -                xe_for_each_engine_class(class)
>> -                    utilization_multi(xe, gt, class,
>> -                              s->flags |
>> -                              TEST_BUSY |
>> -                              TEST_TRAILING_IDLE |
>> -                              TEST_ISOLATION);
>> +    igt_subtest_group {
>> +        igt_fixture {
>> +            struct drm_client_fdinfo info = { };
>> +
>> +            igt_require(igt_parse_drm_fdinfo(xe, &info, engine_map,
>> +                             ARRAY_SIZE(engine_map),
>> +                             NULL, 0));
>> +            igt_require(info.num_engines);
> 
> humn... is this fixture exectuded in addition to the outer fixture
> for each each subtest? Otherwise it won't have the fd open and thus no
> client.

Yes, it is executed in addition to the outer fixture (but if the outer 
fixture fails, this one should not run), so xe is already opened. This 
fixture applies at the group scope - if it fails or is skipped, all 
tests in the group will also fail or be skipped.

However, as Kamil pointed out, fixtures are executed even if no test 
from the group is selected for execution. This means that if we run 
igt at xe_drm_fdinfo@basic-mem (which is outside this group), the fixture 
from the utilization group still runs, potentially logging an unmet 
requirement.

IIUC, the only solution is to move the checks inside the subtests.

> 
> Lucas De Marchi



More information about the igt-dev mailing list