[PATCH 1/2] lib: Add DRM driver sysfs profiling knob toggling functions

Kamil Konieczny kamil.konieczny at linux.intel.com
Mon Mar 18 12:32:37 UTC 2024


Hi Adrián,
On 2024-03-16 at 22:00:37 +0000, Adrián Larumbe wrote:
> Some DRM drivers need to have their accounting HW toggled on demand from
> user space so that fdinfo's drm-engine and drm-cycles tags can be updated
> upon job completion.
> 
> A profiler such as gputop should be able to check which DRM devices have
> such a sysfs knob, record its original state, toggle-enable it and revert
> this operation right before exiting.
> 
> A new igt library igt_profiling.c file was added because using igt lib's
> sysfs access functions would've triggered a cascade of linking dependencies
> in intel_gpu_top, which only statically links a very small subset of the
> igt library.
> 

Please add here Cc: 

Cc: tvrtko.ursulin at intel.com
Cc: daniel at ffwll.ch
Cc: boris.brezillon at collabora.com

You are also touching igt_device_scan, so +Cc Zbigniew.
Cc: "Zbigniew Kempczyński" <zbigniew.kempczynski at intel.com>

> Signed-off-by: Adrián Larumbe <adrian.larumbe at collabora.com>
> ---
>  lib/igt_device_scan.c | 45 +++++++++++++++++++++++++++++++++++++++++
>  lib/igt_device_scan.h |  7 +++++++
>  lib/igt_profiling.c   | 47 +++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_profiling.h   | 31 ++++++++++++++++++++++++++++
>  lib/meson.build       |  1 +
>  5 files changed, 131 insertions(+)
>  create mode 100644 lib/igt_profiling.c
>  create mode 100644 lib/igt_profiling.h
> 
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index fbf3fa482e21..e5b126cc5448 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -1105,6 +1105,51 @@ void igt_devices_scan(bool force)
>  	igt_devs.devs_scanned = true;
>  }
>  
> +struct igt_profiled_device *igt_devices_profiled(void)
> +{
> +	struct igt_profiled_device *profiled_devices;
> +	struct igt_device *dev;
> +	unsigned int devlist_len;
> +	unsigned int i = 0;
> +
> +	if (!igt_devs.devs_scanned)
> +		return NULL;
> +
> +	devlist_len = igt_list_length(&igt_devs.all);
> +	if (devlist_len == 0)
> +		return NULL;
> +
> +	profiled_devices = malloc(devlist_len * sizeof(struct igt_profiled_device));
> +	if (!profiled_devices)
> +		return NULL;
> +
> +	memset(profiled_devices, 0, devlist_len * sizeof(struct igt_profiled_device));
> +
> +	igt_list_for_each_entry(dev, &igt_devs.all, link) {
> +		char path[PATH_MAX];
> +		int sysfs_fd;
> +
> +		if (!get_attr(dev, "profiling"))
> +			continue;
> +
> +		snprintf(path, sizeof(path), "%s/%s", dev->syspath, "profiling");
> +		sysfs_fd = open(path, O_RDONLY);
> +		if (sysfs_fd < 0)
> +			continue;
> +
> +		profiled_devices[i].syspath = dev->syspath;
> +		profiled_devices[i++].original_state =
> +			strtoul(get_attr(dev, "profiling"), NULL, 10);
> +	}
> +
> +	if (i == 0) {
> +		free(profiled_devices);
> +		profiled_devices = NULL;
> +	}
> +
> +	return profiled_devices;
> +}
> +
>  static inline void _pr_simple(const char *k, const char *v)
>  {
>  	printf("    %-16s: %s\n", k, v);
> diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
> index 48690e236c01..6c725d9081b2 100644
> --- a/lib/igt_device_scan.h
> +++ b/lib/igt_device_scan.h
> @@ -63,8 +63,15 @@ struct igt_device_card {
>  	uint16_t pci_vendor, pci_device;
>  };
>  
> +struct igt_profiled_device {
> +	char *syspath;
> +	bool original_state;
> +};
> +
>  void igt_devices_scan(bool force);
>  
> +struct igt_profiled_device *igt_devices_profiled(void);
> +
>  void igt_devices_print(const struct igt_devices_print_format *fmt);
>  void igt_devices_print_vendors(void);
>  void igt_device_print_filter_types(void);
> diff --git a/lib/igt_profiling.c b/lib/igt_profiling.c
> new file mode 100644
> index 000000000000..63a2dd949dbc
> --- /dev/null
> +++ b/lib/igt_profiling.c
> @@ -0,0 +1,47 @@

Add here SPDX MIT licence, see other headers, for example
lib/intel_blt.h, so Add at begin of .c file:

// SPDX-License-Identifier: MIT

> +/*
> + * Copyright © 2024 Collabora Ltd.
> + * Copyright 2024 Adrian Larumbe <adrian.larumbe at collabora.com>
-------------- ^
Be consistent in using '(c)', it is missing here.

> + * Copyright 2024 Amazon.com, Inc. or its affiliates.
-------------- ^
Same here.

> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a

Remove this, it is replaced by SPDX.

> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include "igt_core.h"
> +#include "igt_sysfs.h"
> +#include "igt_device_scan.h"
---------------- ^
Keep it sorted alphabetically.

> +#include "igt_profiling.h"
---------------- ^
Same here.

> +
> +#include <fcntl.h>
----------- ^^

Move system includes before igt ones.

> +
> +void igt_devices_toggle_profiling(struct igt_profiled_device *devices, bool enable)
> +{
> +	for (unsigned int i = 0; devices[i].syspath; i++) {
> +		int sysfs_fd = open(devices[i].syspath, O_RDONLY);
> +
> +		if (sysfs_fd < 0)
> +			continue;
> +
> +		igt_sysfs_set_boolean(sysfs_fd, "profiling",
> +				      enable ? true : devices[i].original_state);
> +
> +		close(sysfs_fd);
> +	}
> +}
> diff --git a/lib/igt_profiling.h b/lib/igt_profiling.h
> new file mode 100644
> index 000000000000..e00345b46e3f
> --- /dev/null
> +++ b/lib/igt_profiling.h
> @@ -0,0 +1,31 @@

Use SPDX here, for example look into lib/intel_blt.h

/* SPDX-License-Identifier: MIT */

> +/*
> + * Copyright (C) 2024 Adrian Larumbe <adrian.larumbe at collabora.com>
> + * Copyright 2024 Collabora Ltd.
-------------- ^
Missed (c)

> + * Copyright 2024 Amazon.com, Inc. or its affiliates.
-------------- ^
Same here.

> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
----- ^
Remove this text, see example intel_blt.h

> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */

In C language headers we useally protect them with ifdef/define/endif, so add:

#ifndef IGT_PROFILING_H
#define IGT_PROFILING_H

and undef at end of file.

> +
> +#include <stdbool.h>
> +
> +struct igt_profiled_device;
> +
> +void igt_devices_toggle_profiling(struct igt_profiled_device *devices, bool enable);

Here add:

#undef IGT_PROFILING_H

> diff --git a/lib/meson.build b/lib/meson.build
> index 6122861d8b7a..70a6fe4485a2 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -24,6 +24,7 @@ lib_sources = [
>  	'igt_device_scan.c',
>  	'igt_drm_clients.h',
>  	'igt_drm_fdinfo.c',
> +        'igt_profiling.c',
--------------- ^
Try to keep it sorted. Imho this is wrong as it adds to igt lib
and you said you want to minimize gputop lib useage?
Maybe you should create igt_profiling lib, like others used by
gputop?

Regards,
Kamil

>  	'igt_aux.c',
>  	'igt_gt.c',
>  	'igt_halffloat.c',
> -- 
> 2.43.0
> 


More information about the igt-dev mailing list