[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