[PATCH v2 2/2] tools/gputop: toggle sysfs profiling knob if available for device
Lucas De Marchi
lucas.demarchi at intel.com
Tue Apr 16 14:02:05 UTC 2024
On Tue, Apr 16, 2024 at 08:49:46AM +0100, Tvrtko Ursulin wrote:
>
>On 15/04/2024 20:35, Adrián Larumbe wrote:
>>On 03.04.2024 19:22, Kamil Konieczny wrote:
>>>Hi Adrián,
>>>On 2024-04-02 at 23:27:45 +0100, Adrián Larumbe wrote:
>>>>For every DRM device that enables its job accounting HW from user space,
>>>>toggle it right before obtaining per-client fdinfo numbers.
>>>>
>>>>Make sure profiling status is returned to its original state before
>>>>exiting, by handling the SIGINT signal just like in intel_gpu_top.
>>>>
>>>>Also dynamically link gputop against igt lib instead of separate per-file
>>>>static libraries to avoid dependence cascade because of using igt_sysfs
>>>>functions.
>>>>
>>>>Cc: Tvrtko Ursulin <tursulin at ursulin.net>
>>>>Cc: Daniel Vetter <daniel at ffwll.ch>
>>>>Cc: Boris Brezillon <boris.brezillon at collabora.com>
>>>>Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
>>>>Signed-off-by: Adrián Larumbe <adrian.larumbe at collabora.com>
>>>>---
>>>> tools/gputop.c | 30 +++++++++++++++++++++++++++++-
>>>> tools/meson.build | 2 +-
>>>> 2 files changed, 30 insertions(+), 2 deletions(-)
>>>>
>>>>diff --git a/tools/gputop.c b/tools/gputop.c
>>>>index 71e28f43ee4c..5b390cbdb3e7 100644
>>>>--- a/tools/gputop.c
>>>>+++ b/tools/gputop.c
>>>>@@ -26,8 +26,10 @@
>>>> #include <sys/sysmacros.h>
>>>> #include <stdbool.h>
>>>>+#include "igt_device_scan.h"
>>>> #include "igt_drm_clients.h"
>>>> #include "igt_drm_fdinfo.h"
>>>>+#include "igt_profiling.h"
>>>> #include "drmtest.h"
>>>> static const char *bars[] = { " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█" };
>>>>@@ -243,9 +245,17 @@ static int client_cmp(const void *_a, const void *_b, void *unused)
>>>> }
>>>>+static volatile bool stop_top;
>>>>+
>>>>+static void sigint_handler(int sig)
>>>>+{
>>>>+ stop_top = true;
>>>>+}
>>>>+
>>>> int main(int argc, char **argv)
>>>> {
>>>> unsigned int period_us = 2e6;
>>>>+ struct igt_profiled_device *profiled_devices = NULL;
>>>> struct igt_drm_clients *clients = NULL;
>>>> int con_w = -1, con_h = -1;
>>>>@@ -253,9 +263,22 @@ int main(int argc, char **argv)
>>>> if (!clients)
>>>> exit(1);
>>>>+ igt_devices_scan(false);
>>>>+
>>>>+ profiled_devices = igt_devices_profiled();
>>>>+ if (profiled_devices != NULL)
>>>>+ igt_devices_toggle_profiling(profiled_devices, true);
>>>>+
>>>>+ if (signal(SIGINT, sigint_handler) == SIG_ERR) {
>>>>+ fprintf(stderr, "Failed to install signal handler!\n");
>>>>+ igt_devices_toggle_profiling(profiled_devices, false);
>>>>+ free(profiled_devices);
>>>>+ profiled_devices = NULL;
>>>>+ }
>>>>+
>>>> igt_drm_clients_scan(clients, NULL, NULL, 0, NULL, 0);
>>>>- for (;;) {
>>>>+ while (!stop_top) {
>>>> struct igt_drm_client *c, *prevc = NULL;
>>>> int i, engine_w = 0, lines = 0;
>>>> struct winsize ws;
>>>>@@ -293,5 +316,10 @@ int main(int argc, char **argv)
>>>> usleep(period_us);
>>>> }
>>>>+ if (profiled_devices != NULL) {
>>>>+ igt_devices_toggle_profiling(profiled_devices, false);
>>>>+ free(profiled_devices);
>>>>+ }
>>>>+
>>>> return 0;
>>>> }
>>>>diff --git a/tools/meson.build b/tools/meson.build
>>>>index ac79d8b5840c..a126d6cad7ba 100644
>>>>--- a/tools/meson.build
>>>>+++ b/tools/meson.build
>>>>@@ -68,7 +68,7 @@ endif
>>>> executable('gputop', 'gputop.c',
>>>> install : true,
>>>> install_rpath : bindir_rpathdir,
>>>>- dependencies : [lib_igt_drm_clients,lib_igt_drm_fdinfo,math])
>>>>+ dependencies : [lib_igt, lib_igt_drm_clients, math])
>>>
>>>Why not creating lib_igt_profiling with only needed dependeces and
>>>adding it here? Before your patch:
>>>
>>>ldd build/tools/gputop
>>>
>>>linux-vdso.so.1 (0x00007ffc5e120000)
>>>libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007bf0a4200000)
>>>/lib64/ld-linux-x86-64.so.2 (0x00007bf0a452b000)
>>>
>>>After:
>>>
>>>ldd gputop |wc -l
>>>78
>>
>>I guess if dynamic library dependencies are seen as undesirable for gputop, then
>>I'll try to do as you suggested, but I suspect a hypothetical lib_igt_profiling
>>static library will contain most of the object files in igt_lib's lib_sources
>>list of files.
>
>It is correct that a goal so far was to avoid linking tools/ (outside
>tests/ even) with igt_igt. But you use quite a lot of lib_igt stuff in
>this work right? I am not sure it is easy to split it all out into
>separate libraries. Question for IGT maintainers.
I think we need to consider what gputop is. I can think of 2 things:
1) reference implementation of the kernel interface
Then maybe hiding the real implementation across several igt libraries
is not a good thing.
2) a tool we really expect end users to use
Then maybe it's ok to depend on those additional libraries, but
ldd gputop |wc -l == 78 for what gputop does seem too much.
3) both (1) and (2)?
Lucas De Marchi
>
>Regards,
>
>Tvrtko
>
>>
>>>Regards,
>>>Kamil
>>>
>>>> intel_l3_parity_src = [ 'intel_l3_parity.c', 'intel_l3_udev_listener.c' ]
>>>> executable('intel_l3_parity', sources : intel_l3_parity_src,
>>>>--
>>>>2.44.0
>>>>
>>
>>Adrian Larumbe
More information about the igt-dev
mailing list