* [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo
@ 2023-09-04 13:24 Tejas Upadhyay
2023-09-04 13:27 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Tejas Upadhyay @ 2023-09-04 13:24 UTC (permalink / raw)
To: igt-dev; +Cc: Tejas Upadhyay, intel-xe
This test verifies fdinfo published by xe KMD with
following tests :
@basic
@drm-total-residents
@drm-shared
@drm-active
TODO : drm-purgeable test is not possbile as we consider objects in
system memory to be purgeable but current xe KMD does not allow
BOs to be created in system memory (instead KMD creates it in
XE_PL_TT which is VRAM backed system memory).
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
tests/intel/xe_drm_fdinfo.c | 285 ++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
2 files changed, 286 insertions(+)
create mode 100644 tests/intel/xe_drm_fdinfo.c
diff --git a/tests/intel/xe_drm_fdinfo.c b/tests/intel/xe_drm_fdinfo.c
new file mode 100644
index 000000000..4f9dcdb66
--- /dev/null
+++ b/tests/intel/xe_drm_fdinfo.c
@@ -0,0 +1,285 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include "igt.h"
+#include "igt_core.h"
+#include "igt_device.h"
+#include "igt_drm_fdinfo.h"
+#include "lib/igt_syncobj.h"
+#include "xe_drm.h"
+#include "xe/xe_ioctl.h"
+#include "xe/xe_query.h"
+#include "xe/xe_spin.h"
+/**
+ * TEST: xe drm fdinfo
+ * Description: Read and verify drm client memory consumption using fdinfo
+ * Feature: SMI, core
+ *
+ * SUBTEST: basic
+ * Category: Software building block
+ * Sub-category: driver
+ * Description: Check if basic fdinfo content is present
+ * Functionality: Per client memory statistics
+ * Run type: FULL
+ * Test category: SysMan
+ *
+ * SUBTEST: drm-total-resident
+ * Category: Software building block
+ * Sub-category: driver
+ * Description: Create and compare total and resident memory consumption by client
+ * Functionality: Per client memory statistics
+ * Run type: FULL
+ * Test category: SysMan
+ *
+ * SUBTEST: drm-shared
+ * Category: Software building block
+ * Sub-category: driver
+ * Description: Create and compare shared memory consumption by client
+ * Functionality: Per client memory statistics
+ * Run type: FULL
+ * Test category: SysMan
+ *
+ * SUBTEST: drm-shared
+ * Category: Software building block
+ * Sub-category: driver
+ * Description: Create and compare shared memory consumption by client
+ * Functionality: Per client memory statistics
+ * Run type: FULL
+ * Test category: SysMan
+ *
+ * SUBTEST: drm-active
+ * Category: Software building block
+ * Sub-category: driver
+ * Description: Create and compare active memory consumption by client
+ * Functionality: Per client memory statistics
+ * Run type: FULL
+ * Test category: SysMan
+ */
+
+IGT_TEST_DESCRIPTION("Read and verify drm client memory consumption using fdinfo");
+
+/* Subtests */
+static void test_active(int fd, struct drm_xe_engine_class_instance *eci)
+{
+ struct drm_client_fdinfo info = { };
+ uint32_t vm;
+ uint64_t addr = 0x1a0000;
+ struct drm_xe_sync sync[2] = {
+ { .flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL, },
+ { .flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL, },
+ };
+ struct drm_xe_exec exec = {
+ .num_batch_buffer = 1,
+ .num_syncs = 2,
+ .syncs = to_user_pointer(sync),
+ };
+#define N_EXEC_QUEUES 2
+ uint32_t exec_queues[N_EXEC_QUEUES];
+ uint32_t bind_exec_queues[N_EXEC_QUEUES];
+ uint32_t syncobjs[N_EXEC_QUEUES + 1];
+ size_t bo_size;
+ uint32_t bo = 0;
+ int region = 0x2; /* VRAM 0 */
+ struct {
+ struct xe_spin spin;
+ uint32_t batch[16];
+ uint64_t pad;
+ uint32_t data;
+ } *data;
+ int i, b;
+
+ vm = xe_vm_create(fd, DRM_XE_VM_CREATE_ASYNC_BIND_OPS, 0);
+ bo_size = sizeof(*data) * N_EXEC_QUEUES;
+ bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd),
+ xe_get_default_alignment(fd));
+ bo = xe_bo_create_flags(fd, vm, bo_size,
+ region);
+ data = xe_bo_map(fd, bo, bo_size);
+
+ for (i = 0; i < N_EXEC_QUEUES; i++) {
+ exec_queues[i] = xe_exec_queue_create(fd, vm, eci, 0);
+ bind_exec_queues[i] = xe_bind_exec_queue_create(fd, vm, 0);
+ syncobjs[i] = syncobj_create(fd, 0);
+ }
+ syncobjs[N_EXEC_QUEUES] = syncobj_create(fd, 0);
+
+ sync[0].handle = syncobj_create(fd, 0);
+ xe_vm_bind_async(fd, vm, bind_exec_queues[0], bo, 0, addr, bo_size,
+ sync, 1);
+
+ for (i = 0; i < N_EXEC_QUEUES; i++) {
+ uint64_t spin_offset = (char *)&data[i].spin - (char *)data;
+ uint64_t spin_addr = addr + spin_offset;
+ int e = i;
+
+ if (i == 0) {
+ xe_spin_init(&data[i].spin, spin_addr, true);
+ exec.exec_queue_id = exec_queues[e];
+ exec.address = spin_addr;
+ sync[0].flags &= ~DRM_XE_SYNC_SIGNAL;
+ sync[1].flags |= DRM_XE_SYNC_SIGNAL;
+ sync[1].handle = syncobjs[e];
+ xe_exec(fd, &exec);
+ xe_spin_wait_started(&data[i].spin);
+
+ addr += bo_size;
+ sync[1].flags &= ~DRM_XE_SYNC_SIGNAL;
+ sync[1].handle = syncobjs[e];
+ xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo, 0, addr,
+ bo_size, sync + 1, 1);
+ addr += bo_size;
+ } else {
+ sync[0].flags |= DRM_XE_SYNC_SIGNAL;
+ xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo, 0, addr,
+ bo_size, sync, 1);
+ }
+
+ b = igt_parse_drm_fdinfo(fd, &info, NULL, 0, NULL, 0);
+ igt_assert(b);
+
+ /* Client memory consumption includes public objects
+ * as well as internal objects hence if bo is active on
+ * N_EXEC_QUEUES consumption should be
+ * >= bo_size + bo_size * N_EXEC_QUEUES */
+ printf("info.total:%ld active:%ld bo_size:%ld\n",
+ info.region_mem[region].total,
+ info.region_mem[region].active, bo_size);
+ igt_assert(info.region_mem[region].active >=
+ bo_size + bo_size * N_EXEC_QUEUES);
+ }
+ xe_spin_end(&data[0].spin);
+
+ syncobj_destroy(fd, sync[0].handle);
+ sync[0].handle = syncobj_create(fd, 0);
+ sync[0].flags |= DRM_XE_SYNC_SIGNAL;
+ xe_vm_unbind_all_async(fd, vm, 0, bo, 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 < N_EXEC_QUEUES; i++) {
+ syncobj_destroy(fd, syncobjs[i]);
+ xe_exec_queue_destroy(fd, exec_queues[i]);
+ xe_exec_queue_destroy(fd, bind_exec_queues[i]);
+ }
+
+ munmap(data, bo_size);
+ gem_close(fd, bo);
+ xe_vm_destroy(fd, vm);
+}
+
+static void test_shared(int xe)
+{
+ struct drm_client_fdinfo info = { };
+ struct drm_gem_flink flink;
+ struct drm_gem_open open_struct;
+ uint32_t bo;
+ int region = 0x1;
+ int ret;
+
+ bo = xe_bo_create_flags(xe, 0, 4096, region);
+
+ flink.handle = bo;
+ ret = igt_ioctl(xe, DRM_IOCTL_GEM_FLINK, &flink);
+ igt_assert_eq(ret, 0);
+
+ open_struct.name = flink.name;
+ ret = igt_ioctl(xe, DRM_IOCTL_GEM_OPEN, &open_struct);
+ igt_assert_eq(ret, 0);
+ igt_assert(open_struct.handle != 0);
+
+ ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
+ igt_assert(ret);
+
+ printf("info.total:%ld shared:%ld\n",
+ info.region_mem[region].total,
+ info.region_mem[region].shared);
+ igt_assert_eq(info.region_mem[region].shared,
+ 2 * 4096);
+
+ gem_close(xe, bo);
+}
+
+static void test_total_resident(int xe)
+{
+ struct drm_xe_query_mem_region *memregion;
+ uint64_t memreg = all_memory_regions(xe), region;
+ struct drm_client_fdinfo info = { };
+ uint32_t vm;
+ uint32_t handle;
+ uint64_t addr = 0x1a0000;
+ int ret;
+
+ vm = xe_vm_create(xe, DRM_XE_VM_CREATE_SCRATCH_PAGE, 0);
+
+ xe_for_each_mem_region(xe, memreg, region) {
+ memregion = xe_mem_region(xe, region);
+
+ handle = xe_bo_create_flags(xe, vm, memregion->min_page_size, region);
+ xe_vm_bind_sync(xe, vm, handle, 0, addr, memregion->min_page_size);
+
+ ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
+ igt_assert(ret);
+ /* currently xe KMD maps I915_MEMORY_CLASS_SYSTEM region to
+ * XE_PL_TT thus we need memregion->instance + 1 */
+ printf("info.total:%ld resident:%ld for instance: %d bo_size:%d\n",
+ info.region_mem[memregion->instance + 1].total,
+ info.region_mem[memregion->instance + 1].resident,
+ memregion->instance, memregion->min_page_size);
+ /* Client memory consumption includes public objects
+ * as well as internal objects hence it should be
+ * >= memregion->min_page_size */
+ igt_assert(info.region_mem[memregion->instance + 1].total >=
+ memregion->min_page_size);
+ igt_assert(info.region_mem[memregion->instance + 1].resident >=
+ memregion->min_page_size);
+ xe_vm_unbind_sync(xe, vm, 0, addr, memregion->min_page_size);
+ gem_close(xe, handle);
+ }
+
+ xe_vm_destroy(xe, vm);
+}
+
+static void basic(int xe)
+{
+ struct drm_client_fdinfo info = { };
+ unsigned int ret;
+
+ ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
+ igt_assert(ret);
+
+ igt_assert(!strcmp(info.driver, "xe"));
+}
+
+igt_main
+{
+ int xe;
+
+ igt_fixture {
+ struct drm_client_fdinfo info = { };
+
+ xe = drm_open_driver(DRIVER_XE);
+ igt_require_xe(xe);
+ igt_require(igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0));
+ }
+
+ igt_describe("Check if basic fdinfo content is present");
+ igt_subtest("basic")
+ basic(xe);
+
+ igt_describe("Create and compare total and resident memory consumption by client");
+ igt_subtest("drm-total-resident")
+ test_total_resident(xe);
+
+ igt_describe("Create and compare shared memory consumption by client");
+ igt_subtest("drm-shared")
+ test_shared(xe);
+
+ igt_describe("Create and compare active memory consumption by client");
+ igt_subtest("drm-active")
+ test_active(xe, xe_hw_engine(xe, 0));
+
+ igt_fixture
+ drm_close_driver(xe);
+}
diff --git a/tests/meson.build b/tests/meson.build
index aa8e3434c..f5f495050 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -275,6 +275,7 @@ intel_xe_progs = [
'xe_compute',
'xe_dma_buf_sync',
'xe_debugfs',
+ 'xe_drm_fdinfo',
'xe_evict',
'xe_exec_balancer',
'xe_exec_basic',
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [igt-dev] ✗ GitLab.Pipeline: warning for tests/xe: Add tests to read and verify fdinfo
2023-09-04 13:24 [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo Tejas Upadhyay
@ 2023-09-04 13:27 ` Patchwork
2023-09-04 14:06 ` [igt-dev] ✗ Fi.CI.BAT: failure " Patchwork
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2023-09-04 13:27 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: igt-dev
== Series Details ==
Series: tests/xe: Add tests to read and verify fdinfo
URL : https://patchwork.freedesktop.org/series/123249/
State : warning
== Summary ==
Pipeline status: FAILED.
see https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/977355 for the overview.
build-containers:build-debian has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/48488920):
section_end:1693833733:prepare_executor
section_start:1693833733:prepare_script
Preparing environment
Running on runner-m5dzqx4r-project-3185-concurrent-0 via 15ca4cde06bd...
section_end:1693833734:prepare_script
section_start:1693833734:get_sources
Getting source from Git repository
$ /host/bin/curl -s -L --cacert /host/ca-certificates.crt --retry 4 -f --retry-delay 60 https://gitlab.freedesktop.org/freedesktop/helm-gitlab-infra/-/raw/main/runner-gating/runner-gating.sh | sh -s -- pre_get_sources_script
Checking if the user of the pipeline is allowed...
Checking if the job's project is part of a well-known group...
Thank you for contributing to freedesktop.org
Fetching changes...
Reinitialized existing Git repository in /builds/gfx-ci/igt-ci-tags/.git/
fatal: unable to access 'https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags.git/': Failed to connect to gitlab.freedesktop.org port 443 after 128842 ms: Couldn't connect to server
section_end:1693833864:get_sources
section_start:1693833864:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1693833864:cleanup_file_variables
ERROR: Job failed: exit code 1
build-containers:build-debian-arm64 has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/48488922):
time="2023-09-04T13:22:48Z" level=fatal msg="pinging docker registry returned: Get https://registry.freedesktop.org/v2/: dial tcp 147.75.198.156:443: i/o timeout"
Building!
STEP 1: FROM debian:buster
Getting image source signatures
Copying blob sha256:d6b7393fb4f375905c31c483d81ce2a2905f88aba8cb198874da2b54035bc41d
Copying config sha256:de08540e8ff0e470ff7956df4bed403725a5f45c186e9bf495da5344ff8fbe84
Writing manifest to image destination
Storing signatures
STEP 2: RUN apt-get update
error running container: error creating container for [/bin/sh -c apt-get update]: time="2023-09-04T13:22:52Z" level=warning msg="signal: killed"
time="2023-09-04T13:22:52Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
: exit status 1
Error: error building at STEP "RUN apt-get update": error while running runtime: exit status 1
section_end:1693833773:step_script
section_start:1693833773:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1693833773:cleanup_file_variables
ERROR: Job failed: exit code 1
build-containers:build-debian-armhf has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/48488921):
"DockerVersion": "",
"Labels": {},
"Architecture": "amd64",
"Os": "linux",
"Layers": [
"sha256:45252bb38c9c74dfe76c4b3808269db61d3b2aebe5e26bf7fcd85e48b93e16f9"
]
}
Skipping, already built
Getting image source signatures
Copying blob sha256:45252bb38c9c74dfe76c4b3808269db61d3b2aebe5e26bf7fcd85e48b93e16f9
Copying config sha256:4a4103f1a476d355d866b481ff96ac05a32a3a715cefcc1cbc1356a8959fb5f8
Writing manifest to image destination
time="2023-09-04T13:23:01Z" level=fatal msg="Error writing manifest: Put https://registry.freedesktop.org/v2/gfx-ci/igt-ci-tags/build-debian-armhf/manifests/commit-b46d794a03b73bf8ab877c7240b58f1e17575fd2: dial tcp: lookup registry.freedesktop.org on 147.75.207.208:53: read udp 10.88.199.218:53108->147.75.207.208:53: i/o timeout"
section_end:1693833782:step_script
section_start:1693833782:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1693833782:cleanup_file_variables
ERROR: Job failed: exit code 1
build-containers:build-debian-mips has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/48488923):
time="2023-09-04T13:23:03Z" level=fatal msg="Error determining repository tags: Get https://registry.freedesktop.org/v2/gfx-ci/igt-ci-tags/build-debian-mips/tags/list?last=commit-86ad7feeadba42668b7d8f1c822526515a0767a8&n=100: dial tcp 147.75.198.156:443: i/o timeout"
Building!
STEP 1: FROM debian:buster
Getting image source signatures
Copying blob sha256:d6b7393fb4f375905c31c483d81ce2a2905f88aba8cb198874da2b54035bc41d
Copying config sha256:de08540e8ff0e470ff7956df4bed403725a5f45c186e9bf495da5344ff8fbe84
Writing manifest to image destination
Storing signatures
STEP 2: RUN apt-get update
error running container: error creating container for [/bin/sh -c apt-get update]: time="2023-09-04T13:23:22Z" level=warning msg="signal: killed"
time="2023-09-04T13:23:22Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
: exit status 1
Error: error building at STEP "RUN apt-get update": error while running runtime: exit status 1
section_end:1693833803:step_script
section_start:1693833803:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1693833803:cleanup_file_variables
ERROR: Job failed: exit code 1
build-containers:build-fedora has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/48488924):
time="2023-09-04T13:22:55Z" level=fatal msg="Error determining repository tags: Get https://registry.freedesktop.org/v2/gfx-ci/igt-ci-tags/build-fedora/tags/list?last=commit-2824470eeed46d448ccc8111f96736da3abe66b5&n=100: dial tcp 147.75.198.156:443: i/o timeout"
Building!
STEP 1: FROM fedora:31
Getting image source signatures
Copying blob sha256:c28ace6b0c4ae099f6f81091731bdf41d9771d28bad96ae4a3507fe950560930
Copying config sha256:a7a37f74ff864eec55891b64ad360d07020827486e30a92ea81d16459645b26a
Writing manifest to image destination
Storing signatures
STEP 2: RUN dnf install -y gcc flex bison libatomic meson ninja-build xdotool 'pkgconfig(libdrm)' 'pkgconfig(pciaccess)' 'pkgconfig(libkmod)' 'pkgconfig(libprocps)' 'pkgconfig(libunwind)' 'pkgconfig(libdw)' 'pkgconfig(pixman-1)' 'pkgconfig(valgrind)' 'pkgconfig(cairo)' 'pkgconfig(libudev)' 'pkgconfig(glib-2.0)' 'pkgconfig(gsl)' 'pkgconfig(alsa)' 'pkgconfig(xmlrpc)' 'pkgconfig(xmlrpc_util)' 'pkgconfig(xmlrpc_client)' 'pkgconfig(json-c)' 'pkgconfig(gtk-doc)' 'pkgconfig(xv)' 'pkgconfig(xrandr)' python3-docutils
error running container: error creating container for [/bin/sh -c dnf install -y gcc flex bison libatomic meson ninja-build xdotool 'pkgconfig(libdrm)' 'pkgconfig(pciaccess)' 'pkgconfig(libkmod)' 'pkgconfig(libprocps)' 'pkgconfig(libunwind)' 'pkgconfig(libdw)' 'pkgconfig(pixman-1)' 'pkgconfig(valgrind)' 'pkgconfig(cairo)' 'pkgconfig(libudev)' 'pkgconfig(glib-2.0)' 'pkgconfig(gsl)' 'pkgconfig(alsa)' 'pkgconfig(xmlrpc)' 'pkgconfig(xmlrpc_util)' 'pkgconfig(xmlrpc_client)' 'pkgconfig(json-c)' 'pkgconfig(gtk-doc)' 'pkgconfig(xv)' 'pkgconfig(xrandr)' python3-docutils]: time="2023-09-04T13:23:43Z" level=warning msg="signal: killed"
time="2023-09-04T13:23:43Z" level=error msg="container_linux.go:346: starting container process caused \"process_linux.go:297: applying cgroup configuration for process caused \\\"mountpoint for cgroup not found\\\"\"\n"
container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"mountpoint for cgroup not found\""
: exit status 1
Error: error building at STEP "RUN dnf install -y gcc flex bison libatomic meson ninja-build xdotool 'pkgconfig(libdrm)' 'pkgconfig(pciaccess)' 'pkgconfig(libkmod)' 'pkgconfig(libprocps)' 'pkgconfig(libunwind)' 'pkgconfig(libdw)' 'pkgconfig(pixman-1)' 'pkgconfig(valgrind)' 'pkgconfig(cairo)' 'pkgconfig(libudev)' 'pkgconfig(glib-2.0)' 'pkgconfig(gsl)' 'pkgconfig(alsa)' 'pkgconfig(xmlrpc)' 'pkgconfig(xmlrpc_util)' 'pkgconfig(xmlrpc_client)' 'pkgconfig(json-c)' 'pkgconfig(gtk-doc)' 'pkgconfig(xv)' 'pkgconfig(xrandr)' python3-docutils": error while running runtime: exit status 1
section_end:1693833823:step_script
section_start:1693833823:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1693833823:cleanup_file_variables
ERROR: Job failed: exit code 1
== Logs ==
For more details see: https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/977355
^ permalink raw reply [flat|nested] 6+ messages in thread
* [igt-dev] ✗ Fi.CI.BAT: failure for tests/xe: Add tests to read and verify fdinfo
2023-09-04 13:24 [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo Tejas Upadhyay
2023-09-04 13:27 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
@ 2023-09-04 14:06 ` Patchwork
2023-09-04 15:00 ` [igt-dev] ✓ CI.xeBAT: success " Patchwork
2023-09-07 14:10 ` [igt-dev] [intel-xe] " Kamil Konieczny
3 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2023-09-04 14:06 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 7617 bytes --]
== Series Details ==
Series: tests/xe: Add tests to read and verify fdinfo
URL : https://patchwork.freedesktop.org/series/123249/
State : failure
== Summary ==
CI Bug Log - changes from IGT_7467 -> IGTPW_9711
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_9711 absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_9711, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/index.html
Participating hosts (39 -> 37)
------------------------------
Missing (2): fi-hsw-4770 fi-snb-2520m
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_9711:
### IGT changes ###
#### Possible regressions ####
* igt@i915_module_load@load:
- bat-adlp-11: [PASS][1] -> [DMESG-WARN][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-adlp-11/igt@i915_module_load@load.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-adlp-11/igt@i915_module_load@load.html
Known issues
------------
Here are the changes found in IGTPW_9711 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@i915_module_load@reload:
- fi-apl-guc: [PASS][3] -> [DMESG-WARN][4] ([i915#180] / [i915#1982] / [i915#7634])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/fi-apl-guc/igt@i915_module_load@reload.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/fi-apl-guc/igt@i915_module_load@reload.html
* igt@i915_pm_rpm@basic-pci-d3-state:
- bat-adlp-11: NOTRUN -> [ABORT][5] ([i915#7977] / [i915#8469] / [i915#8668])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-adlp-11/igt@i915_pm_rpm@basic-pci-d3-state.html
* igt@i915_pm_rpm@module-reload:
- fi-apl-guc: [PASS][6] -> [DMESG-WARN][7] ([i915#180] / [i915#7634] / [i915#8585])
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/fi-apl-guc/igt@i915_pm_rpm@module-reload.html
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/fi-apl-guc/igt@i915_pm_rpm@module-reload.html
* igt@i915_selftest@live@reset:
- fi-apl-guc: [PASS][8] -> [DMESG-WARN][9] ([i915#7634]) +36 similar issues
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/fi-apl-guc/igt@i915_selftest@live@reset.html
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/fi-apl-guc/igt@i915_selftest@live@reset.html
* igt@i915_suspend@basic-s2idle-without-i915:
- fi-apl-guc: [PASS][10] -> [DMESG-WARN][11] ([i915#180] / [i915#7634])
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/fi-apl-guc/igt@i915_suspend@basic-s2idle-without-i915.html
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/fi-apl-guc/igt@i915_suspend@basic-s2idle-without-i915.html
* igt@kms_flip@basic-flip-vs-wf_vblank@a-dp6:
- bat-adlp-11: [PASS][12] -> [FAIL][13] ([i915#6121]) +5 similar issues
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-adlp-11/igt@kms_flip@basic-flip-vs-wf_vblank@a-dp6.html
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-adlp-11/igt@kms_flip@basic-flip-vs-wf_vblank@a-dp6.html
* igt@kms_flip@basic-flip-vs-wf_vblank@b-dp5:
- bat-adlp-11: [PASS][14] -> [DMESG-WARN][15] ([i915#6868])
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-adlp-11/igt@kms_flip@basic-flip-vs-wf_vblank@b-dp5.html
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-adlp-11/igt@kms_flip@basic-flip-vs-wf_vblank@b-dp5.html
* igt@kms_pipe_crc_basic@read-crc-frame-sequence:
- bat-dg2-11: NOTRUN -> [SKIP][16] ([i915#1845])
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-dg2-11/igt@kms_pipe_crc_basic@read-crc-frame-sequence.html
* igt@kms_psr@primary_page_flip:
- bat-rplp-1: NOTRUN -> [ABORT][17] ([i915#8442] / [i915#8668] / [i915#8860])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-rplp-1/igt@kms_psr@primary_page_flip.html
#### Possible fixes ####
* igt@gem_exec_suspend@basic-s0@smem:
- bat-dg2-9: [INCOMPLETE][18] ([i915#6311]) -> [PASS][19]
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-dg2-9/igt@gem_exec_suspend@basic-s0@smem.html
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-dg2-9/igt@gem_exec_suspend@basic-s0@smem.html
* igt@kms_chamelium_edid@hdmi-edid-read:
- {bat-dg2-13}: [DMESG-WARN][20] ([i915#7952]) -> [PASS][21]
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-dg2-13/igt@kms_chamelium_edid@hdmi-edid-read.html
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-dg2-13/igt@kms_chamelium_edid@hdmi-edid-read.html
* igt@kms_pipe_crc_basic@read-crc-frame-sequence@pipe-d-edp-1:
- bat-rplp-1: [ABORT][22] ([i915#8442] / [i915#8668]) -> [PASS][23]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-rplp-1/igt@kms_pipe_crc_basic@read-crc-frame-sequence@pipe-d-edp-1.html
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-rplp-1/igt@kms_pipe_crc_basic@read-crc-frame-sequence@pipe-d-edp-1.html
#### Warnings ####
* igt@i915_pm_backlight@basic-brightness:
- bat-adlp-11: [ABORT][24] ([i915#8668]) -> [SKIP][25] ([i915#3546] / [i915#7561])
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_7467/bat-adlp-11/igt@i915_pm_backlight@basic-brightness.html
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/bat-adlp-11/igt@i915_pm_backlight@basic-brightness.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
[i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
[i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
[i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
[i915#6121]: https://gitlab.freedesktop.org/drm/intel/issues/6121
[i915#6311]: https://gitlab.freedesktop.org/drm/intel/issues/6311
[i915#6868]: https://gitlab.freedesktop.org/drm/intel/issues/6868
[i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
[i915#7634]: https://gitlab.freedesktop.org/drm/intel/issues/7634
[i915#7952]: https://gitlab.freedesktop.org/drm/intel/issues/7952
[i915#7977]: https://gitlab.freedesktop.org/drm/intel/issues/7977
[i915#8442]: https://gitlab.freedesktop.org/drm/intel/issues/8442
[i915#8469]: https://gitlab.freedesktop.org/drm/intel/issues/8469
[i915#8585]: https://gitlab.freedesktop.org/drm/intel/issues/8585
[i915#8668]: https://gitlab.freedesktop.org/drm/intel/issues/8668
[i915#8860]: https://gitlab.freedesktop.org/drm/intel/issues/8860
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7467 -> IGTPW_9711
CI-20190529: 20190529
CI_DRM_13593: 70c5bfd28eab769b048876075fc3561c3f04a54a @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_9711: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/index.html
IGT_7467: 7467
Testlist changes
----------------
+igt@xe_drm_fdinfo@basic
+igt@xe_drm_fdinfo@drm-active
+igt@xe_drm_fdinfo@drm-shared
+igt@xe_drm_fdinfo@drm-total-resident
-igt@xe_copy_basic@mem-copy
-igt@xe_copy_basic@mem-set
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/index.html
[-- Attachment #2: Type: text/html, Size: 9180 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* [igt-dev] ✓ CI.xeBAT: success for tests/xe: Add tests to read and verify fdinfo
2023-09-04 13:24 [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo Tejas Upadhyay
2023-09-04 13:27 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
2023-09-04 14:06 ` [igt-dev] ✗ Fi.CI.BAT: failure " Patchwork
@ 2023-09-04 15:00 ` Patchwork
2023-09-07 14:10 ` [igt-dev] [intel-xe] " Kamil Konieczny
3 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2023-09-04 15:00 UTC (permalink / raw)
To: Tejas Upadhyay; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 1387 bytes --]
== Series Details ==
Series: tests/xe: Add tests to read and verify fdinfo
URL : https://patchwork.freedesktop.org/series/123249/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_7467_BAT -> XEIGTPW_9711_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (4 -> 4)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in XEIGTPW_9711_BAT that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_flip@basic-flip-vs-wf_vblank@d-edp1:
- bat-adlp-7: [PASS][1] -> [FAIL][2] ([Intel XE#480]) +1 similar issue
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_7467/bat-adlp-7/igt@kms_flip@basic-flip-vs-wf_vblank@d-edp1.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_9711/bat-adlp-7/igt@kms_flip@basic-flip-vs-wf_vblank@d-edp1.html
[Intel XE#480]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/480
Build changes
-------------
* IGT: IGT_7467 -> IGTPW_9711
IGTPW_9711: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9711/index.html
IGT_7467: 7467
xe-354-7ec520d3a63b6e95174329108cd44359a70907ba: 7ec520d3a63b6e95174329108cd44359a70907ba
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_9711/index.html
[-- Attachment #2: Type: text/html, Size: 1949 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo
2023-09-04 13:24 [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo Tejas Upadhyay
` (2 preceding siblings ...)
2023-09-04 15:00 ` [igt-dev] ✓ CI.xeBAT: success " Patchwork
@ 2023-09-07 14:10 ` Kamil Konieczny
2023-09-08 7:32 ` Upadhyay, Tejas
3 siblings, 1 reply; 6+ messages in thread
From: Kamil Konieczny @ 2023-09-07 14:10 UTC (permalink / raw)
To: igt-dev; +Cc: Tejas Upadhyay, intel-xe
Hi Tejas,
On 2023-09-04 at 18:54:15 +0530, Tejas Upadhyay wrote:
> This test verifies fdinfo published by xe KMD with
-- ^^^^^^^^^^^^^^^^^
Added tests to verify
> following tests :
------------^ ---^
s/tests :/subtests:/
> @basic
> @drm-total-residents
> @drm-shared
> @drm-active
>
> TODO : drm-purgeable test is not possbile as we consider objects in
----- ^
Remove space before ':'
> system memory to be purgeable but current xe KMD does not allow
> BOs to be created in system memory (instead KMD creates it in
> XE_PL_TT which is VRAM backed system memory).
>
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
> tests/intel/xe_drm_fdinfo.c | 285 ++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 2 files changed, 286 insertions(+)
> create mode 100644 tests/intel/xe_drm_fdinfo.c
>
> diff --git a/tests/intel/xe_drm_fdinfo.c b/tests/intel/xe_drm_fdinfo.c
> new file mode 100644
> index 000000000..4f9dcdb66
> --- /dev/null
> +++ b/tests/intel/xe_drm_fdinfo.c
> @@ -0,0 +1,285 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#include "igt.h"
> +#include "igt_core.h"
> +#include "igt_device.h"
> +#include "igt_drm_fdinfo.h"
> +#include "lib/igt_syncobj.h"
> +#include "xe_drm.h"
> +#include "xe/xe_ioctl.h"
> +#include "xe/xe_query.h"
> +#include "xe/xe_spin.h"
> +/**
> + * TEST: xe drm fdinfo
> + * Description: Read and verify drm client memory consumption using fdinfo
> + * Feature: SMI, core
> + *
> + * SUBTEST: basic
> + * Category: Software building block
> + * Sub-category: driver
> + * Description: Check if basic fdinfo content is present
> + * Functionality: Per client memory statistics
> + * Run type: FULL
> + * Test category: SysMan
> + *
> + * SUBTEST: drm-total-resident
> + * Category: Software building block
> + * Sub-category: driver
> + * Description: Create and compare total and resident memory consumption by client
> + * Functionality: Per client memory statistics
> + * Run type: FULL
> + * Test category: SysMan
> + *
> + * SUBTEST: drm-shared
> + * Category: Software building block
> + * Sub-category: driver
> + * Description: Create and compare shared memory consumption by client
> + * Functionality: Per client memory statistics
> + * Run type: FULL
> + * Test category: SysMan
> + *
> + * SUBTEST: drm-shared
----- ^
This is copy-paste, you already have 'drm-shared' above,
remove this.
> + * Category: Software building block
> + * Sub-category: driver
> + * Description: Create and compare shared memory consumption by client
> + * Functionality: Per client memory statistics
> + * Run type: FULL
> + * Test category: SysMan
> + *
> + * SUBTEST: drm-active
> + * Category: Software building block
> + * Sub-category: driver
> + * Description: Create and compare active memory consumption by client
> + * Functionality: Per client memory statistics
> + * Run type: FULL
> + * Test category: SysMan
For all fields which are the same for every subtest, you may
just add them into TEST: description and remove from SUBTEST:
This will make it more compact.
> + */
> +
> +IGT_TEST_DESCRIPTION("Read and verify drm client memory consumption using fdinfo");
> +
> +/* Subtests */
> +static void test_active(int fd, struct drm_xe_engine_class_instance *eci)
> +{
> + struct drm_client_fdinfo info = { };
-- ^^^^^^^^
Replace spaces from begin of line with tabs, there are too many
to list that all, use checkpatch.pl script from linux kernel.
Sample output from checkpatch:
ERROR: code indent should use tabs where possible
#97: FILE: tests/intel/xe_drm_fdinfo.c:66:
+ struct drm_client_fdinfo info = { };$
> + uint32_t vm;
> + uint64_t addr = 0x1a0000;
> + struct drm_xe_sync sync[2] = {
> + { .flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL, },
> + { .flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL, },
> + };
> + struct drm_xe_exec exec = {
> + .num_batch_buffer = 1,
> + .num_syncs = 2,
> + .syncs = to_user_pointer(sync),
> + };
> +#define N_EXEC_QUEUES 2
> + uint32_t exec_queues[N_EXEC_QUEUES];
> + uint32_t bind_exec_queues[N_EXEC_QUEUES];
> + uint32_t syncobjs[N_EXEC_QUEUES + 1];
> + size_t bo_size;
> + uint32_t bo = 0;
> + int region = 0x2; /* VRAM 0 */
> + struct {
> + struct xe_spin spin;
> + uint32_t batch[16];
> + uint64_t pad;
> + uint32_t data;
> + } *data;
> + int i, b;
> +
> + vm = xe_vm_create(fd, DRM_XE_VM_CREATE_ASYNC_BIND_OPS, 0);
> + bo_size = sizeof(*data) * N_EXEC_QUEUES;
> + bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd),
> + xe_get_default_alignment(fd));
> + bo = xe_bo_create_flags(fd, vm, bo_size,
> + region);
> + data = xe_bo_map(fd, bo, bo_size);
> +
> + for (i = 0; i < N_EXEC_QUEUES; i++) {
> + exec_queues[i] = xe_exec_queue_create(fd, vm, eci, 0);
> + bind_exec_queues[i] = xe_bind_exec_queue_create(fd, vm, 0);
> + syncobjs[i] = syncobj_create(fd, 0);
> + }
> + syncobjs[N_EXEC_QUEUES] = syncobj_create(fd, 0);
> +
> + sync[0].handle = syncobj_create(fd, 0);
> + xe_vm_bind_async(fd, vm, bind_exec_queues[0], bo, 0, addr, bo_size,
> + sync, 1);
> +
> + for (i = 0; i < N_EXEC_QUEUES; i++) {
> + uint64_t spin_offset = (char *)&data[i].spin - (char *)data;
> + uint64_t spin_addr = addr + spin_offset;
> + int e = i;
> +
> + if (i == 0) {
> + xe_spin_init(&data[i].spin, spin_addr, true);
> + exec.exec_queue_id = exec_queues[e];
> + exec.address = spin_addr;
> + sync[0].flags &= ~DRM_XE_SYNC_SIGNAL;
> + sync[1].flags |= DRM_XE_SYNC_SIGNAL;
> + sync[1].handle = syncobjs[e];
> + xe_exec(fd, &exec);
> + xe_spin_wait_started(&data[i].spin);
> +
> + addr += bo_size;
> + sync[1].flags &= ~DRM_XE_SYNC_SIGNAL;
> + sync[1].handle = syncobjs[e];
> + xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo, 0, addr,
> + bo_size, sync + 1, 1);
> + addr += bo_size;
> + } else {
> + sync[0].flags |= DRM_XE_SYNC_SIGNAL;
> + xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo, 0, addr,
> + bo_size, sync, 1);
> + }
> +
> + b = igt_parse_drm_fdinfo(fd, &info, NULL, 0, NULL, 0);
> + igt_assert(b);
Use igt_erorr_f and print here errno.
> +
> + /* Client memory consumption includes public objects
> + * as well as internal objects hence if bo is active on
> + * N_EXEC_QUEUES consumption should be
> + * >= bo_size + bo_size * N_EXEC_QUEUES */
> + printf("info.total:%ld active:%ld bo_size:%ld\n",
------- ^
Use igt_debug or igt_info.
> + info.region_mem[region].total,
> + info.region_mem[region].active, bo_size);
> + igt_assert(info.region_mem[region].active >=
> + bo_size + bo_size * N_EXEC_QUEUES);
> + }
> + xe_spin_end(&data[0].spin);
> +
> + syncobj_destroy(fd, sync[0].handle);
> + sync[0].handle = syncobj_create(fd, 0);
> + sync[0].flags |= DRM_XE_SYNC_SIGNAL;
> + xe_vm_unbind_all_async(fd, vm, 0, bo, 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 < N_EXEC_QUEUES; i++) {
> + syncobj_destroy(fd, syncobjs[i]);
> + xe_exec_queue_destroy(fd, exec_queues[i]);
> + xe_exec_queue_destroy(fd, bind_exec_queues[i]);
> + }
> +
> + munmap(data, bo_size);
> + gem_close(fd, bo);
> + xe_vm_destroy(fd, vm);
> +}
> +
> +static void test_shared(int xe)
> +{
> + struct drm_client_fdinfo info = { };
> + struct drm_gem_flink flink;
> + struct drm_gem_open open_struct;
> + uint32_t bo;
> + int region = 0x1;
> + int ret;
> +
> + bo = xe_bo_create_flags(xe, 0, 4096, region);
> +
> + flink.handle = bo;
> + ret = igt_ioctl(xe, DRM_IOCTL_GEM_FLINK, &flink);
> + igt_assert_eq(ret, 0);
> +
> + open_struct.name = flink.name;
> + ret = igt_ioctl(xe, DRM_IOCTL_GEM_OPEN, &open_struct);
> + igt_assert_eq(ret, 0);
> + igt_assert(open_struct.handle != 0);
> +
> + ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
> + igt_assert(ret);
> +
> + printf("info.total:%ld shared:%ld\n",
--- ^
Same here, igt_info
> + info.region_mem[region].total,
> + info.region_mem[region].shared);
> + igt_assert_eq(info.region_mem[region].shared,
> + 2 * 4096);
> +
> + gem_close(xe, bo);
> +}
> +
> +static void test_total_resident(int xe)
> +{
> + struct drm_xe_query_mem_region *memregion;
> + uint64_t memreg = all_memory_regions(xe), region;
> + struct drm_client_fdinfo info = { };
> + uint32_t vm;
> + uint32_t handle;
> + uint64_t addr = 0x1a0000;
> + int ret;
> +
> + vm = xe_vm_create(xe, DRM_XE_VM_CREATE_SCRATCH_PAGE, 0);
> +
> + xe_for_each_mem_region(xe, memreg, region) {
> + memregion = xe_mem_region(xe, region);
> +
> + handle = xe_bo_create_flags(xe, vm, memregion->min_page_size, region);
> + xe_vm_bind_sync(xe, vm, handle, 0, addr, memregion->min_page_size);
> +
> + ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
> + igt_assert(ret);
> + /* currently xe KMD maps I915_MEMORY_CLASS_SYSTEM region to
-------------------------------- ^^^^
Is this correct? Should it be XE?
> + * XE_PL_TT thus we need memregion->instance + 1 */
> + printf("info.total:%ld resident:%ld for instance: %d bo_size:%d\n",
> + info.region_mem[memregion->instance + 1].total,
> + info.region_mem[memregion->instance + 1].resident,
> + memregion->instance, memregion->min_page_size);
> + /* Client memory consumption includes public objects
> + * as well as internal objects hence it should be
> + * >= memregion->min_page_size */
> + igt_assert(info.region_mem[memregion->instance + 1].total >=
> + memregion->min_page_size);
> + igt_assert(info.region_mem[memregion->instance + 1].resident >=
> + memregion->min_page_size);
> + xe_vm_unbind_sync(xe, vm, 0, addr, memregion->min_page_size);
> + gem_close(xe, handle);
> + }
> +
> + xe_vm_destroy(xe, vm);
> +}
> +
> +static void basic(int xe)
> +{
> + struct drm_client_fdinfo info = { };
> + unsigned int ret;
> +
> + ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
> + igt_assert(ret);
-----------^
Use: igt_assert_eq(ret, 0) or better igt_assert_f(ret == 0, "failed with err:%d\n", errno);
> +
> + igt_assert(!strcmp(info.driver, "xe"));
Why do you need this here? You got this with:
xe = drm_open_driver(DRIVER_XE);
> +}
> +
> +igt_main
> +{
> + int xe;
> +
> + igt_fixture {
> + struct drm_client_fdinfo info = { };
> +
> + xe = drm_open_driver(DRIVER_XE);
> + igt_require_xe(xe);
> + igt_require(igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0));
------------------ ^ --------- ^
Why this code here?
This is duplicated in basic() subtest.
Regards,
Kamil
> + }
> +
> + igt_describe("Check if basic fdinfo content is present");
> + igt_subtest("basic")
> + basic(xe);
> +
> + igt_describe("Create and compare total and resident memory consumption by client");
> + igt_subtest("drm-total-resident")
> + test_total_resident(xe);
> +
> + igt_describe("Create and compare shared memory consumption by client");
> + igt_subtest("drm-shared")
> + test_shared(xe);
> +
> + igt_describe("Create and compare active memory consumption by client");
> + igt_subtest("drm-active")
> + test_active(xe, xe_hw_engine(xe, 0));
> +
> + igt_fixture
> + drm_close_driver(xe);
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index aa8e3434c..f5f495050 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -275,6 +275,7 @@ intel_xe_progs = [
> 'xe_compute',
> 'xe_dma_buf_sync',
> 'xe_debugfs',
> + 'xe_drm_fdinfo',
> 'xe_evict',
> 'xe_exec_balancer',
> 'xe_exec_basic',
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo
2023-09-07 14:10 ` [igt-dev] [intel-xe] " Kamil Konieczny
@ 2023-09-08 7:32 ` Upadhyay, Tejas
0 siblings, 0 replies; 6+ messages in thread
From: Upadhyay, Tejas @ 2023-09-08 7:32 UTC (permalink / raw)
To: Kamil Konieczny, igt-dev@lists.freedesktop.org
Cc: intel-xe@lists.freedesktop.org
> -----Original Message-----
> From: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> Sent: Thursday, September 7, 2023 7:40 PM
> To: igt-dev@lists.freedesktop.org
> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Subject: Re: [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo
>
> Hi Tejas,
>
> On 2023-09-04 at 18:54:15 +0530, Tejas Upadhyay wrote:
> > This test verifies fdinfo published by xe KMD with
> -- ^^^^^^^^^^^^^^^^^
> Added tests to verify
>
> > following tests :
> ------------^ ---^
> s/tests :/subtests:/
ok
>
> > @basic
> > @drm-total-residents
> > @drm-shared
> > @drm-active
> >
> > TODO : drm-purgeable test is not possbile as we consider objects in
> ----- ^
> Remove space before ':'
Sure
>
> > system memory to be purgeable but current xe KMD does not allow BOs to
> > be created in system memory (instead KMD creates it in XE_PL_TT which
> > is VRAM backed system memory).
> >
> > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > ---
> > tests/intel/xe_drm_fdinfo.c | 285
> ++++++++++++++++++++++++++++++++++++
> > tests/meson.build | 1 +
> > 2 files changed, 286 insertions(+)
> > create mode 100644 tests/intel/xe_drm_fdinfo.c
> >
> > diff --git a/tests/intel/xe_drm_fdinfo.c b/tests/intel/xe_drm_fdinfo.c
> > new file mode 100644 index 000000000..4f9dcdb66
> > --- /dev/null
> > +++ b/tests/intel/xe_drm_fdinfo.c
> > @@ -0,0 +1,285 @@
> > +// SPDX-License-Identifier: MIT
> > +/*
> > + * Copyright © 2023 Intel Corporation */
> > +
> > +#include "igt.h"
> > +#include "igt_core.h"
> > +#include "igt_device.h"
> > +#include "igt_drm_fdinfo.h"
> > +#include "lib/igt_syncobj.h"
> > +#include "xe_drm.h"
> > +#include "xe/xe_ioctl.h"
> > +#include "xe/xe_query.h"
> > +#include "xe/xe_spin.h"
> > +/**
> > + * TEST: xe drm fdinfo
> > + * Description: Read and verify drm client memory consumption using
> > +fdinfo
> > + * Feature: SMI, core
> > + *
> > + * SUBTEST: basic
> > + * Category: Software building block
> > + * Sub-category: driver
> > + * Description: Check if basic fdinfo content is present
> > + * Functionality: Per client memory statistics
> > + * Run type: FULL
> > + * Test category: SysMan
> > + *
> > + * SUBTEST: drm-total-resident
> > + * Category: Software building block
> > + * Sub-category: driver
> > + * Description: Create and compare total and resident memory
> > +consumption by client
> > + * Functionality: Per client memory statistics
> > + * Run type: FULL
> > + * Test category: SysMan
> > + *
> > + * SUBTEST: drm-shared
> > + * Category: Software building block
> > + * Sub-category: driver
> > + * Description: Create and compare shared memory consumption by
> > +client
> > + * Functionality: Per client memory statistics
> > + * Run type: FULL
> > + * Test category: SysMan
> > + *
> > + * SUBTEST: drm-shared
> ----- ^
> This is copy-paste, you already have 'drm-shared' above, remove this.
Yes sure.
>
> > + * Category: Software building block
> > + * Sub-category: driver
> > + * Description: Create and compare shared memory consumption by
> > + client
> > + * Functionality: Per client memory statistics
> > + * Run type: FULL
> > + * Test category: SysMan
> > + *
> > + * SUBTEST: drm-active
> > + * Category: Software building block
> > + * Sub-category: driver
> > + * Description: Create and compare active memory consumption by
> > + client
> > + * Functionality: Per client memory statistics
> > + * Run type: FULL
> > + * Test category: SysMan
>
> For all fields which are the same for every subtest, you may just add them into
> TEST: description and remove from SUBTEST:
> This will make it more compact.
I will do that.
>
> > + */
> > +
> > +IGT_TEST_DESCRIPTION("Read and verify drm client memory consumption
> > +using fdinfo");
> > +
> > +/* Subtests */
> > +static void test_active(int fd, struct drm_xe_engine_class_instance
> > +*eci) {
> > + struct drm_client_fdinfo info = { };
> -- ^^^^^^^^
> Replace spaces from begin of line with tabs, there are too many to list that all,
> use checkpatch.pl script from linux kernel.
>
> Sample output from checkpatch:
Yes I forgot to apply checkpatch. I will run it.
>
> ERROR: code indent should use tabs where possible
> #97: FILE: tests/intel/xe_drm_fdinfo.c:66:
> + struct drm_client_fdinfo info = { };$
>
> > + uint32_t vm;
> > + uint64_t addr = 0x1a0000;
> > + struct drm_xe_sync sync[2] = {
> > + { .flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL, },
> > + { .flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL, },
> > + };
> > + struct drm_xe_exec exec = {
> > + .num_batch_buffer = 1,
> > + .num_syncs = 2,
> > + .syncs = to_user_pointer(sync),
> > + };
> > +#define N_EXEC_QUEUES 2
> > + uint32_t exec_queues[N_EXEC_QUEUES];
> > + uint32_t bind_exec_queues[N_EXEC_QUEUES];
> > + uint32_t syncobjs[N_EXEC_QUEUES + 1];
> > + size_t bo_size;
> > + uint32_t bo = 0;
> > + int region = 0x2; /* VRAM 0 */
> > + struct {
> > + struct xe_spin spin;
> > + uint32_t batch[16];
> > + uint64_t pad;
> > + uint32_t data;
> > + } *data;
> > + int i, b;
> > +
> > + vm = xe_vm_create(fd, DRM_XE_VM_CREATE_ASYNC_BIND_OPS, 0);
> > + bo_size = sizeof(*data) * N_EXEC_QUEUES;
> > + bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd),
> > + xe_get_default_alignment(fd));
> > + bo = xe_bo_create_flags(fd, vm, bo_size,
> > + region);
> > + data = xe_bo_map(fd, bo, bo_size);
> > +
> > + for (i = 0; i < N_EXEC_QUEUES; i++) {
> > + exec_queues[i] = xe_exec_queue_create(fd, vm, eci, 0);
> > + bind_exec_queues[i] = xe_bind_exec_queue_create(fd, vm, 0);
> > + syncobjs[i] = syncobj_create(fd, 0);
> > + }
> > + syncobjs[N_EXEC_QUEUES] = syncobj_create(fd, 0);
> > +
> > + sync[0].handle = syncobj_create(fd, 0);
> > + xe_vm_bind_async(fd, vm, bind_exec_queues[0], bo, 0, addr, bo_size,
> > + sync, 1);
> > +
> > + for (i = 0; i < N_EXEC_QUEUES; i++) {
> > + uint64_t spin_offset = (char *)&data[i].spin - (char *)data;
> > + uint64_t spin_addr = addr + spin_offset;
> > + int e = i;
> > +
> > + if (i == 0) {
> > + xe_spin_init(&data[i].spin, spin_addr, true);
> > + exec.exec_queue_id = exec_queues[e];
> > + exec.address = spin_addr;
> > + sync[0].flags &= ~DRM_XE_SYNC_SIGNAL;
> > + sync[1].flags |= DRM_XE_SYNC_SIGNAL;
> > + sync[1].handle = syncobjs[e];
> > + xe_exec(fd, &exec);
> > + xe_spin_wait_started(&data[i].spin);
> > +
> > + addr += bo_size;
> > + sync[1].flags &= ~DRM_XE_SYNC_SIGNAL;
> > + sync[1].handle = syncobjs[e];
> > + xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo, 0, addr,
> > + bo_size, sync + 1, 1);
> > + addr += bo_size;
> > + } else {
> > + sync[0].flags |= DRM_XE_SYNC_SIGNAL;
> > + xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo, 0, addr,
> > + bo_size, sync, 1);
> > + }
> > +
> > + b = igt_parse_drm_fdinfo(fd, &info, NULL, 0, NULL, 0);
> > + igt_assert(b);
>
> Use igt_erorr_f and print here errno.
Ok
>
> > +
> > + /* Client memory consumption includes public objects
> > + * as well as internal objects hence if bo is active on
> > + * N_EXEC_QUEUES consumption should be
> > + * >= bo_size + bo_size * N_EXEC_QUEUES */
> > + printf("info.total:%ld active:%ld bo_size:%ld\n",
> ------- ^
> Use igt_debug or igt_info.
Sure
>
> > + info.region_mem[region].total,
> > + info.region_mem[region].active, bo_size);
> > + igt_assert(info.region_mem[region].active >=
> > + bo_size + bo_size * N_EXEC_QUEUES);
> > + }
> > + xe_spin_end(&data[0].spin);
> > +
> > + syncobj_destroy(fd, sync[0].handle);
> > + sync[0].handle = syncobj_create(fd, 0);
> > + sync[0].flags |= DRM_XE_SYNC_SIGNAL;
> > + xe_vm_unbind_all_async(fd, vm, 0, bo, 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 < N_EXEC_QUEUES; i++) {
> > + syncobj_destroy(fd, syncobjs[i]);
> > + xe_exec_queue_destroy(fd, exec_queues[i]);
> > + xe_exec_queue_destroy(fd, bind_exec_queues[i]);
> > + }
> > +
> > + munmap(data, bo_size);
> > + gem_close(fd, bo);
> > + xe_vm_destroy(fd, vm);
> > +}
> > +
> > +static void test_shared(int xe)
> > +{
> > + struct drm_client_fdinfo info = { };
> > + struct drm_gem_flink flink;
> > + struct drm_gem_open open_struct;
> > + uint32_t bo;
> > + int region = 0x1;
> > + int ret;
> > +
> > + bo = xe_bo_create_flags(xe, 0, 4096, region);
> > +
> > + flink.handle = bo;
> > + ret = igt_ioctl(xe, DRM_IOCTL_GEM_FLINK, &flink);
> > + igt_assert_eq(ret, 0);
> > +
> > + open_struct.name = flink.name;
> > + ret = igt_ioctl(xe, DRM_IOCTL_GEM_OPEN, &open_struct);
> > + igt_assert_eq(ret, 0);
> > + igt_assert(open_struct.handle != 0);
> > +
> > + ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
> > + igt_assert(ret);
> > +
> > + printf("info.total:%ld shared:%ld\n",
> --- ^
> Same here, igt_info
Ok
>
> > + info.region_mem[region].total,
> > + info.region_mem[region].shared);
> > + igt_assert_eq(info.region_mem[region].shared,
> > + 2 * 4096);
> > +
> > + gem_close(xe, bo);
> > +}
> > +
> > +static void test_total_resident(int xe) {
> > + struct drm_xe_query_mem_region *memregion;
> > + uint64_t memreg = all_memory_regions(xe), region;
> > + struct drm_client_fdinfo info = { };
> > + uint32_t vm;
> > + uint32_t handle;
> > + uint64_t addr = 0x1a0000;
> > + int ret;
> > +
> > + vm = xe_vm_create(xe, DRM_XE_VM_CREATE_SCRATCH_PAGE, 0);
> > +
> > + xe_for_each_mem_region(xe, memreg, region) {
> > + memregion = xe_mem_region(xe, region);
> > +
> > + handle = xe_bo_create_flags(xe, vm, memregion-
> >min_page_size, region);
> > + xe_vm_bind_sync(xe, vm, handle, 0, addr, memregion-
> >min_page_size);
> > +
> > + ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
> > + igt_assert(ret);
> > + /* currently xe KMD maps I915_MEMORY_CLASS_SYSTEM
> region to
> -------------------------------- ^^^^
> Is this correct? Should it be XE?
Only macro available right now, how ever I can just name it in xe term as it is just comment.
>
> > + * XE_PL_TT thus we need memregion->instance + 1 */
> > + printf("info.total:%ld resident:%ld for instance: %d
> bo_size:%d\n",
> > + info.region_mem[memregion->instance + 1].total,
> > + info.region_mem[memregion->instance + 1].resident,
> > + memregion->instance, memregion->min_page_size);
> > + /* Client memory consumption includes public objects
> > + * as well as internal objects hence it should be
> > + * >= memregion->min_page_size */
> > + igt_assert(info.region_mem[memregion->instance + 1].total
> >=
> > + memregion->min_page_size);
> > + igt_assert(info.region_mem[memregion->instance +
> 1].resident >=
> > + memregion->min_page_size);
> > + xe_vm_unbind_sync(xe, vm, 0, addr, memregion-
> >min_page_size);
> > + gem_close(xe, handle);
> > + }
> > +
> > + xe_vm_destroy(xe, vm);
> > +}
> > +
> > +static void basic(int xe)
> > +{
> > + struct drm_client_fdinfo info = { };
> > + unsigned int ret;
> > +
> > + ret = igt_parse_drm_fdinfo(xe, &info, NULL, 0, NULL, 0);
> > + igt_assert(ret);
> -----------^
> Use: igt_assert_eq(ret, 0) or better igt_assert_f(ret == 0, "failed with
> err:%d\n", errno);
>
> > +
> > + igt_assert(!strcmp(info.driver, "xe"));
>
> Why do you need this here? You got this with:
> xe = drm_open_driver(DRIVER_XE);
Fdinfo is populated with all memory stats as well as driver info which we read through procfs file system.
This is just making sure that whatever we read from fdinfo procfs also reflecting same driver.
>
> > +}
> > +
> > +igt_main
> > +{
> > + int xe;
> > +
> > + igt_fixture {
> > + struct drm_client_fdinfo info = { };
> > +
> > + xe = drm_open_driver(DRIVER_XE);
> > + igt_require_xe(xe);
> > + igt_require(igt_parse_drm_fdinfo(xe, &info, NULL, 0,
> > +NULL, 0));
> ------------------ ^ --------- ^
> Why this code here?
> This is duplicated in basic() subtest.
Agree this is the fixure which just checks if we can read or not. Without it none of test can be done. While basic test is validating info apart from just reading it.
Thanks,
Tejas
>
> Regards,
> Kamil
>
> > + }
> > +
> > + igt_describe("Check if basic fdinfo content is present");
> > + igt_subtest("basic")
> > + basic(xe);
> > +
> > + igt_describe("Create and compare total and resident memory
> consumption by client");
> > + igt_subtest("drm-total-resident")
> > + test_total_resident(xe);
> > +
> > + igt_describe("Create and compare shared memory consumption by
> client");
> > + igt_subtest("drm-shared")
> > + test_shared(xe);
> > +
> > + igt_describe("Create and compare active memory consumption by
> client");
> > + igt_subtest("drm-active")
> > + test_active(xe, xe_hw_engine(xe, 0));
> > +
> > + igt_fixture
> > + drm_close_driver(xe); }
> > diff --git a/tests/meson.build b/tests/meson.build index
> > aa8e3434c..f5f495050 100644
> > --- a/tests/meson.build
> > +++ b/tests/meson.build
> > @@ -275,6 +275,7 @@ intel_xe_progs = [
> > 'xe_compute',
> > 'xe_dma_buf_sync',
> > 'xe_debugfs',
> > + 'xe_drm_fdinfo',
> > 'xe_evict',
> > 'xe_exec_balancer',
> > 'xe_exec_basic',
> > --
> > 2.25.1
> >
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-09-08 7:32 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-04 13:24 [igt-dev] [intel-xe] tests/xe: Add tests to read and verify fdinfo Tejas Upadhyay
2023-09-04 13:27 ` [igt-dev] ✗ GitLab.Pipeline: warning for " Patchwork
2023-09-04 14:06 ` [igt-dev] ✗ Fi.CI.BAT: failure " Patchwork
2023-09-04 15:00 ` [igt-dev] ✓ CI.xeBAT: success " Patchwork
2023-09-07 14:10 ` [igt-dev] [intel-xe] " Kamil Konieczny
2023-09-08 7:32 ` Upadhyay, Tejas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox