From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 98D8910E16D for ; Tue, 12 Dec 2023 05:17:02 +0000 (UTC) Message-ID: <614076ae-8184-4584-a6a6-751a83184144@linux.intel.com> Date: Tue, 12 Dec 2023 10:49:47 +0530 MIME-Version: 1.0 Subject: Re: [PATCH i-g-t] tests/xe: Remove xe_perf_pmu Content-Language: en-US To: Ashutosh Dixit , igt-dev@lists.freedesktop.org References: <20231211162536.2790126-1-ashutosh.dixit@intel.com> From: Aravind Iddamsetty In-Reply-To: <20231211162536.2790126-1-ashutosh.dixit@intel.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: venkata.ramana.nayana@intel.com, Lucas De Marchi , Rodrigo Vivi Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" List-ID: On 12/11/23 21:55, Ashutosh Dixit wrote: > Group busyness uapi implemented in PMU in the kernel has been discontinued > and will be replaced by a different group busyness uapi and a different > implementation. Because of this, we are proposing to remove the PMU code > from the kernel, till the correct uapi is implemented. Therefore drop the > corresponding IGT too, since it caters to the old uapi. > > Signed-off-by: Ashutosh Dixit Acked-by: Aravind Iddamsetty Thanks, Aravind, > --- > tests/intel/xe_perf_pmu.c | 331 -------------------------------------- > tests/meson.build | 1 - > 2 files changed, 332 deletions(-) > delete mode 100644 tests/intel/xe_perf_pmu.c > > diff --git a/tests/intel/xe_perf_pmu.c b/tests/intel/xe_perf_pmu.c > deleted file mode 100644 > index 42cf62729142..000000000000 > --- a/tests/intel/xe_perf_pmu.c > +++ /dev/null > @@ -1,331 +0,0 @@ > -// SPDX-License-Identifier: MIT > -/* > - * Copyright © 2021 Intel Corporation > - */ > - > -/** > - * TEST: Basic tests for verify pmu perf interface > - * Category: Hardware building block > - * Sub-category: pmu interface > - * Functionality: pmu > - * Test category: functionality test > - */ > - > -#include > -#include > - > -#include "igt.h" > -#include "lib/igt_syncobj.h" > -#include "lib/intel_reg.h" > -#include "lib/igt_perf.h" > -#include "xe_drm.h" > -#include "xe/xe_ioctl.h" > -#include "xe/xe_query.h" > -#include "xe/xe_spin.h" > - > -#define MAX_INSTANCE 9 > - > -static uint64_t pmu_read(int fd) > -{ > - uint64_t data[2]; > - > - igt_assert_eq(read(fd, data, sizeof(data)), sizeof(data)); > - > - return data[0]; > -} > - > -static int open_pmu(int fd, uint64_t config) > -{ > - int perf_fd; > - > - perf_fd = perf_xe_open(fd, config); > - igt_skip_on(perf_fd < 0 && errno == ENODEV); > - igt_assert(perf_fd >= 0); > - > - return perf_fd; > -} > - > -static uint64_t engine_group_get_config(int gt, int class) > -{ > - uint64_t config; > - > - switch (class) { > - case DRM_XE_ENGINE_CLASS_COPY: > - config = DRM_XE_PMU_COPY_GROUP_BUSY(gt); > - break; > - case DRM_XE_ENGINE_CLASS_RENDER: > - case DRM_XE_ENGINE_CLASS_COMPUTE: > - config = DRM_XE_PMU_RENDER_GROUP_BUSY(gt); > - break; > - case DRM_XE_ENGINE_CLASS_VIDEO_DECODE: > - case DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE: > - config = DRM_XE_PMU_MEDIA_GROUP_BUSY(gt); > - break; > - } > - > - return config; > -} > - > -/** > - * Test: Basic test for measure the active time when engine of any class active > - * > - * SUBTEST: any-engine-group-busy > - * Description: > - * Run a test to measure the global activity time by submitting > - * the WL to all existing engines. > - * Run type: FULL > - * > - */ > -static void test_any_engine_busyness(int fd, struct drm_xe_engine_class_instance *eci) > -{ > - uint32_t vm; > - uint64_t addr = 0x1a0000; > - struct drm_xe_sync sync[2] = { > - { .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, }, > - { .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, }, > - }; > - struct drm_xe_exec exec = { > - .num_batch_buffer = 1, > - .num_syncs = 2, > - .syncs = to_user_pointer(sync), > - }; > - uint32_t exec_queue; > - uint32_t syncobj; > - size_t bo_size; > - uint32_t bo = 0; > - struct xe_spin *spin; > - struct xe_spin_opts spin_opts = { .addr = addr, .preempt = false }; > - uint32_t pmu_fd; > - uint64_t count, idle; > - > - vm = xe_vm_create(fd, DRM_XE_VM_CREATE_FLAG_ASYNC_DEFAULT, 0); > - bo_size = sizeof(*spin); > - bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd), > - xe_get_default_alignment(fd)); > - > - bo = xe_bo_create(fd, vm, bo_size, vram_if_possible(fd, eci->gt_id), 0); > - spin = xe_bo_map(fd, bo, bo_size); > - > - exec_queue = xe_exec_queue_create(fd, vm, eci, 0); > - syncobj = syncobj_create(fd, 0); > - > - sync[0].handle = syncobj_create(fd, 0); > - xe_vm_bind_async(fd, vm, 0, bo, 0, addr, bo_size, sync, 1); > - > - pmu_fd = open_pmu(fd, DRM_XE_PMU_ANY_ENGINE_GROUP_BUSY(eci->gt_id)); > - idle = pmu_read(pmu_fd); > - igt_assert(!idle); > - > - xe_spin_init(spin, &spin_opts); > - > - sync[0].flags &= ~DRM_XE_SYNC_FLAG_SIGNAL; > - sync[1].flags |= DRM_XE_SYNC_FLAG_SIGNAL; > - sync[1].handle = syncobj; > - > - exec.exec_queue_id = exec_queue; > - exec.address = addr; > - xe_exec(fd, &exec); > - > - xe_spin_wait_started(spin); > - usleep(50000); > - > - igt_assert(!syncobj_wait(fd, &syncobj, 1, 1, 0, NULL)); > - xe_spin_end(spin); > - > - igt_assert(syncobj_wait(fd, &syncobj, 1, INT64_MAX, 0, NULL)); > - igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL)); > - > - sync[0].flags |= DRM_XE_SYNC_FLAG_SIGNAL; > - xe_vm_unbind_async(fd, vm, 0, 0, addr, bo_size, sync, 1); > - igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL)); > - > - syncobj_destroy(fd, sync[0].handle); > - syncobj_destroy(fd, syncobj); > - > - count = pmu_read(pmu_fd); > - igt_assert_lt_u64(idle, count); > - igt_debug("Incrementing counter all-busy-group %ld ns\n", count); > - > - xe_exec_queue_destroy(fd, exec_queue); > - munmap(spin, bo_size); > - gem_close(fd, bo); > - xe_vm_destroy(fd, vm); > - close(pmu_fd); > -} > - > -/** > - * Test: Basic test for measure the active time across engine class > - * > - * SUBTEST: render-busy > - * Description: > - * Run a test to measure the active engine class time by submitting the > - * WL to all instances of a class > - * Run type: FULL > - * > - * SUBTEST: compute-busy > - * Description: Run copy-group-busy test > - * Run type: FULL > - * > - * SUBTEST: copy-busy > - * Description: Run copy-group-busy test > - * Run type: FULL > - * > - * SUBTEST: vcs-busy > - * Description: Run copy-group-busy test > - * Run type: FULL > - * > - * SUBTEST: vecs-busy > - * Description: Run copy-group-busy test > - * Run type: FULL > - * > - */ > - > -static void test_engine_group_busyness(int fd, int gt, int class, const char *name) > -{ > - uint32_t vm; > - uint64_t addr = 0x1a0000; > - struct drm_xe_sync sync[2] = { > - { .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, }, > - { .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, }, > - }; > - struct drm_xe_exec exec = { > - .num_batch_buffer = 1, > - .num_syncs = 2, > - .syncs = to_user_pointer(sync), > - }; > - uint32_t exec_queues[MAX_INSTANCE]; > - uint32_t syncobjs[MAX_INSTANCE]; > - int pmu_fd; > - size_t bo_size; > - uint32_t bo = 0, i = 0; > - struct { > - struct xe_spin spin; > - } *data; > - struct xe_spin_opts spin_opts = { .addr = addr, .preempt = false }; > - struct drm_xe_engine_class_instance *hwe; > - struct drm_xe_engine_class_instance eci[MAX_INSTANCE]; > - int num_placements = 0; > - uint64_t config, count, idle; > - > - config = engine_group_get_config(gt, class); > - > - xe_for_each_engine(fd, hwe) { > - if (hwe->engine_class != class || hwe->gt_id != gt) > - continue; > - > - eci[num_placements++] = *hwe; > - } > - > - igt_skip_on_f(!num_placements, "Engine class:%d gt:%d not enabled on this platform\n", > - class, gt); > - > - vm = xe_vm_create(fd, DRM_XE_VM_CREATE_FLAG_ASYNC_DEFAULT, 0); > - bo_size = sizeof(*data) * num_placements; > - bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd), xe_get_default_alignment(fd)); > - > - bo = xe_bo_create(fd, vm, bo_size, vram_if_possible(fd, gt), 0); > - data = xe_bo_map(fd, bo, bo_size); > - > - for (i = 0; i < num_placements; i++) { > - struct drm_xe_exec_queue_create create = { > - .vm_id = vm, > - .width = 1, > - .num_placements = num_placements, > - .instances = to_user_pointer(eci), > - }; > - > - igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_EXEC_QUEUE_CREATE, > - &create), 0); > - exec_queues[i] = create.exec_queue_id; > - syncobjs[i] = syncobj_create(fd, 0); > - }; > - > - sync[0].handle = syncobj_create(fd, 0); > - xe_vm_bind_async(fd, vm, 0, bo, 0, addr, bo_size, sync, 1); > - > - pmu_fd = open_pmu(fd, config); > - idle = pmu_read(pmu_fd); > - igt_assert(!idle); > - > - for (i = 0; i < num_placements; i++) { > - spin_opts.addr = addr + (char *)&data[i].spin - (char *)data; > - xe_spin_init(&data[i].spin, &spin_opts); > - sync[0].flags &= ~DRM_XE_SYNC_FLAG_SIGNAL; > - sync[1].flags |= DRM_XE_SYNC_FLAG_SIGNAL; > - sync[1].handle = syncobjs[i]; > - > - exec.exec_queue_id = exec_queues[i]; > - exec.address = spin_opts.addr; > - xe_exec(fd, &exec); > - xe_spin_wait_started(&data[i].spin); > - } > - > - for (i = 0; i < num_placements; i++) { > - xe_spin_end(&data[i].spin); > - igt_assert(syncobj_wait(fd, &syncobjs[i], 1, INT64_MAX, 0, > - NULL)); > - } > - > - igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL)); > - > - sync[0].flags |= DRM_XE_SYNC_FLAG_SIGNAL; > - xe_vm_unbind_async(fd, vm, 0, 0, addr, bo_size, sync, 1); > - igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL)); > - > - > - syncobj_destroy(fd, sync[0].handle); > - for (i = 0; i < num_placements; i++) { > - syncobj_destroy(fd, syncobjs[i]); > - xe_exec_queue_destroy(fd, exec_queues[i]); > - } > - > - count = pmu_read(pmu_fd); > - igt_assert_lt_u64(idle, count); > - igt_debug("Incrementing counter %s-gt-%d %ld ns\n", name, gt, count); > - > - munmap(data, bo_size); > - gem_close(fd, bo); > - xe_vm_destroy(fd, vm); > - close(pmu_fd); > -} > - > -igt_main > -{ > - struct drm_xe_engine_class_instance *hwe; > - const struct section { > - const char *name; > - int class; > - } sections[] = { > - { "render-busy", DRM_XE_ENGINE_CLASS_RENDER }, > - { "compute-busy", DRM_XE_ENGINE_CLASS_COMPUTE }, > - { "copy-busy", DRM_XE_ENGINE_CLASS_COPY }, > - { "vcs-busy", DRM_XE_ENGINE_CLASS_VIDEO_DECODE }, > - { "vecs-busy", DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE }, > - { NULL }, > - }; > - int gt; > - int class; > - int fd; > - > - igt_fixture { > - fd = drm_open_driver(DRIVER_XE); > - xe_device_get(fd); > - } > - > - for (const struct section *s = sections; s->name; s++) { > - igt_subtest_f("%s", s->name) > - xe_for_each_gt(fd, gt) > - xe_for_each_engine_class(class) > - if (class == s->class) > - test_engine_group_busyness(fd, gt, class, s->name); > - } > - > - igt_subtest("any-engine-group-busy") > - xe_for_each_engine(fd, hwe) > - test_any_engine_busyness(fd, hwe); > - > - igt_fixture { > - xe_device_put(fd); > - close(fd); > - } > -} > diff --git a/tests/meson.build b/tests/meson.build > index f6cfbcf5ef9f..4430ca739275 100644 > --- a/tests/meson.build > +++ b/tests/meson.build > @@ -305,7 +305,6 @@ intel_xe_progs = [ > 'xe_pm', > 'xe_pm_residency', > 'xe_prime_self_import', > - 'xe_perf_pmu', > 'xe_query', > 'xe_sysfs_tile', > 'xe_uevent',