[PATCH i-g-t v2 4/5] tests/intel/xe_pmu: Add tests to validate engine activity on all engines

Riana Tauro riana.tauro at intel.com
Fri May 9 14:45:25 UTC 2025



On 5/9/2025 5:30 AM, Umesh Nerlige Ramappa wrote:
> On Thu, May 08, 2025 at 11:20:05AM +0530, Riana Tauro wrote:
>> Add tests to validate engine activity by running workload on
>> all engines simultaneously.
>>
>> Also add trailing idle test.
>>
>> v2: use allocator
>>
>> Signed-off-by: Riana Tauro <riana.tauro at intel.com>
>> ---
>> tests/intel/xe_pmu.c | 67 ++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 67 insertions(+)
>>
>> diff --git a/tests/intel/xe_pmu.c b/tests/intel/xe_pmu.c
>> index d78b8bea5..2df460b07 100644
>> --- a/tests/intel/xe_pmu.c
>> +++ b/tests/intel/xe_pmu.c
>> @@ -32,6 +32,14 @@
>>  * Description: Test to validate engine activity by running workload 
>> and trailing idle on one engine
>>  *        and check if all other engines are idle
>>  *
>> + * SUBTEST: engine-activity-all-load
>> + * Description: Test to validate engine activity by running workload 
>> on all engines
>> + *        simultaneously
>> + *
>> + * SUBTEST: engine-activity-all-load-idle
>> + * Description: Test to validate engine activity by running workload 
>> on all engines
>> + *        simultaneously and trailing idle
>> + *
>>  * SUBTEST: all-fn-engine-activity-load
>>  * Description: Test to validate engine activity by running load on 
>> all functions simultaneously
>>  *
>> @@ -319,6 +327,57 @@ static void engine_activity_load_single(int fd, 
>> int num_engines,
>>     log_all_engines(num_engines, busy_idx, TEST_IDLE, before, after);
>> }
>>
>> +static void engine_activity_load_all(int fd, int num_engines, 
>> unsigned int flags)
>> +{
>> +    uint64_t ahnd, config, before[2 * num_engines], after[2 * 
>> num_engines];
>> +    struct drm_xe_engine_class_instance *eci;
>> +    struct xe_cork *cork[num_engines];
>> +    int idx = 0, engine_idx = 0;
>> +    int pmu_fd[2 * num_engines];
>> +    uint32_t vm;
>> +
>> +    pmu_fd[0] = -1;
>> +    vm = xe_vm_create(fd, 0, 0);
>> +    ahnd = intel_allocator_open(fd, 0, INTEL_ALLOCATOR_RELOC);
>> +
>> +    xe_for_each_engine(fd, eci) {
>> +        engine_idx = idx >> 1;
>> +
>> +        config = get_event_config(eci->gt_id, eci, "engine-active- 
>> ticks");
>> +        pmu_fd[idx++] = open_group(fd, config, pmu_fd[0]);
>> +
>> +        config = get_event_config(eci->gt_id, eci, "engine-total- 
>> ticks");
>> +        pmu_fd[idx++] = open_group(fd, config, pmu_fd[0]);
>> +
>> +        if (flags & TEST_LOAD) {
>> +            cork[engine_idx] = xe_cork_create_opts(fd, eci, vm, 1, 
>> 1, .ahnd = ahnd);
>> +            xe_cork_sync_start(fd, cork[engine_idx]);
>> +        }
>> +    }
>> +
>> +    pmu_read_multi(pmu_fd[0], 2 * num_engines, before);
>> +    usleep(SLEEP_DURATION * USEC_PER_SEC);
>> +    if (flags & TEST_TRAILING_IDLE) {
>> +        for (idx = 0; idx < num_engines; idx++)
>> +            xe_cork_sync_end(fd, cork[idx]);
>> +    }
>> +    pmu_read_multi(pmu_fd[0], 2 * num_engines, after);
>> +
>> +    for (idx = 0; idx < num_engines * 2; idx += 2) {
>> +        engine_idx = idx >> 1;
>> +        if (flags & TEST_LOAD)
>> +            check_and_end_cork(fd, cork[engine_idx]);
>> +        xe_cork_destroy(fd, cork[engine_idx]);
>> +        close(pmu_fd[idx]);
>> +        close(pmu_fd[idx + 1]);
>> +    }
>> +
>> +    xe_vm_destroy(fd, vm);
>> +    put_ahnd(ahnd);
>> +
>> +    log_all_engines(num_engines, -1, TEST_LOAD, before, after);
> 
> okay, I see a new variant here ^. Looks like you are using -1 to 
> indicate that all are either idle or loaded. It should still work the 
> same way as here if you split the helpers.
> 
> Ideally, if you want to do this, you could use one helper and just pass 
> an array - check[num_engines]. Each entry in the array would just be 
> either TEST_IDLE/TEST_LOAD.
> 
> Any approach is okay with me.
> 

This approach seems better. It'll be one function.
Will try this

Thanks
Riana

> Test itself LGTM,
> 
> Thanks,
> Umesh
> 
>> +}
>> +
>> static void engine_activity_all_fn(int fd, struct 
>> drm_xe_engine_class_instance *eci, int num_fns)
>> {
>>     uint64_t config, engine_active_ticks, engine_total_ticks;
>> @@ -683,6 +742,14 @@ igt_main
>>     test_each_engine("engine-activity-single-load-idle", fd, eci)
>>         engine_activity_load_single(fd, num_engines, eci, TEST_LOAD | 
>> TEST_TRAILING_IDLE);
>>
>> +    igt_describe("Validate engine activity by loading all engines 
>> simultaenously");
>> +    igt_subtest("engine-activity-all-load")
>> +        engine_activity_load_all(fd, num_engines, TEST_LOAD);
>> +
>> +    igt_describe("Validate engine activity by loading all engines 
>> simultaenously and trailing idle");
>> +    igt_subtest("engine-activity-all-load-idle")
>> +        engine_activity_load_all(fd, num_engines, TEST_LOAD | 
>> TEST_TRAILING_IDLE);
>> +
>>     igt_subtest_group {
>>         unsigned int num_fns;
>>
>> -- 
>> 2.47.1
>>


More information about the igt-dev mailing list