From: Boris Brezillon <boris.brezillon@collabora.com>
To: Lukas Zapolskas <lukas.zapolskas@arm.com>
Cc: "Liviu Dudau" <liviu.dudau@arm.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Adrián Larumbe" <adrian.larumbe@collabora.com>,
nd@arm.com, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org,
"Mihail Atanassov" <mihail.atanassov@arm.com>
Subject: Re: [PATCH v6 3/7] drm/panthor: Add panthor perf initialization and termination
Date: Thu, 18 Dec 2025 11:33:18 +0100 [thread overview]
Message-ID: <20251218113318.774e18c6@fedora> (raw)
In-Reply-To: <20251215171453.2506348-4-lukas.zapolskas@arm.com>
On Mon, 15 Dec 2025 17:14:49 +0000
Lukas Zapolskas <lukas.zapolskas@arm.com> wrote:
> Added the panthor_perf system initialization and unplug code to allow
> for the handling of userspace sessions to be added in follow-up
> patches.
>
> Signed-off-by: Lukas Zapolskas <lukas.zapolskas@arm.com>
> Reviewed-by: Adrián Larumbe <adrian.larumbe@collabora.com>
> ---
> drivers/gpu/drm/panthor/panthor_device.c | 2 +
> drivers/gpu/drm/panthor/panthor_device.h | 5 +-
> drivers/gpu/drm/panthor/panthor_perf.c | 63 +++++++++++++++++++++++-
> drivers/gpu/drm/panthor/panthor_perf.h | 1 +
> 4 files changed, 69 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
> index dc237da92340..3063ffbead45 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.c
> +++ b/drivers/gpu/drm/panthor/panthor_device.c
> @@ -120,6 +120,7 @@ void panthor_device_unplug(struct panthor_device *ptdev)
> /* Now, try to cleanly shutdown the GPU before the device resources
> * get reclaimed.
> */
> + panthor_perf_unplug(ptdev);
> panthor_sched_unplug(ptdev);
> panthor_fw_unplug(ptdev);
> panthor_mmu_unplug(ptdev);
> @@ -323,6 +324,7 @@ int panthor_device_init(struct panthor_device *ptdev)
>
> err_disable_autosuspend:
> pm_runtime_dont_use_autosuspend(ptdev->base.dev);
> + panthor_perf_unplug(ptdev);
>
> err_unplug_sched:
> panthor_sched_unplug(ptdev);
> diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
> index 64b0048de6ac..e1a6250cecc8 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.h
> +++ b/drivers/gpu/drm/panthor/panthor_device.h
> @@ -28,8 +28,8 @@ struct panthor_hw;
> struct panthor_job;
> struct panthor_mmu;
> struct panthor_fw;
> -struct panthor_perfcnt;
> struct panthor_pwr;
> +struct panthor_perf;
> struct panthor_vm;
> struct panthor_vm_pool;
>
> @@ -160,6 +160,9 @@ struct panthor_device {
> /** @devfreq: Device frequency scaling management data. */
> struct panthor_devfreq *devfreq;
>
> + /** @perf: Performance counter management data. */
> + struct panthor_perf *perf;
> +
> /** @unplug: Device unplug related fields. */
> struct {
> /** @lock: Lock used to serialize unplug operations. */
> diff --git a/drivers/gpu/drm/panthor/panthor_perf.c b/drivers/gpu/drm/panthor/panthor_perf.c
> index 842d62826ac3..3a65d6d326e8 100644
> --- a/drivers/gpu/drm/panthor/panthor_perf.c
> +++ b/drivers/gpu/drm/panthor/panthor_perf.c
> @@ -4,6 +4,7 @@
>
> #include <linux/bitops.h>
> #include <drm/panthor_drm.h>
> +#include <drm/drm_print.h>
>
> #include "panthor_device.h"
> #include "panthor_fw.h"
> @@ -22,6 +23,19 @@
> */
> #define PANTHOR_HW_COUNTER_SIZE (sizeof(u32))
>
> +struct panthor_perf {
> + /** @next_session: The ID of the next session. */
> + u32 next_session;
> +
> + /** @session_range: The number of sessions supported at a time. */
> + struct xa_limit session_range;
> +
> + /**
> + * @sessions: Global map of sessions, accessed by their ID.
> + */
> + struct xarray sessions;
Unless there's a need to have global session ID (sessions can be shared
and accessed from different processes), I'd move the xarray to some
panthor_file_perf object and make this session ID per-FD. Actually, I'm
not even sure I see a use case for having more than one session
per-file, so it could even be just a panthor_perf_session pointer and a
lock in panthor_file:
struct panthor_file {
...
struct {
struct mutex lock;
struct panthor_perf_session *session;
} perf;
};
If we want to restrict the total number of sessions, we can have an
atomic_t in panthor_perf, but I think what really matters is the
maximum number of active sessions, and I believe we already have a
counter for that (panthor_perf_sampler::enabled_clients).
> +};
> +
> struct panthor_perf_counter_block {
> struct drm_panthor_perf_block_header header;
> u64 counters[];
> @@ -76,14 +90,61 @@ static void panthor_perf_info_init(struct panthor_device *const ptdev)
> * panthor_perf_init - Initialize the performance counter subsystem.
> * @ptdev: Panthor device
> *
> + * The performance counters require the FW interface to be available to setup the
> + * sampling ringbuffers, so this must be called only after FW is initialized.
> + *
> * Return: 0 on success, negative error code on failure.
> */
> int panthor_perf_init(struct panthor_device *ptdev)
> {
> + struct panthor_perf *perf __free(kfree) = NULL;
> + int ret = 0;
> +
> if (!ptdev)
> return -EINVAL;
>
> panthor_perf_info_init(ptdev);
>
> - return 0;
> + perf = kzalloc(sizeof(*perf), GFP_KERNEL);
> + if (ZERO_OR_NULL_PTR(perf))
> + return -ENOMEM;
> +
> + xa_init_flags(&perf->sessions, XA_FLAGS_ALLOC);
> +
> + perf->session_range = (struct xa_limit) {
> + .min = 0,
> + .max = 1,
> + };
> +
> + drm_info(&ptdev->base, "Performance counter subsystem initialized");
> +
> + ptdev->perf = no_free_ptr(perf);
> +
> + return ret;
> +}
> +
> +/**
> + * panthor_perf_unplug - Terminate the performance counter subsystem.
> + * @ptdev: Panthor device.
> + *
> + * This function will terminate the performance counter control structures and any remaining
> + * sessions, after waiting for any pending interrupts.
> + */
> +void panthor_perf_unplug(struct panthor_device *ptdev)
> +{
> + struct panthor_perf *perf = ptdev->perf;
> +
> + if (!perf)
> + return;
> +
> + if (!xa_empty(&perf->sessions)) {
> + drm_err(&ptdev->base,
> + "Performance counter sessions active when unplugging the driver!");
> + }
> +
> + xa_destroy(&perf->sessions);
> +
> + kfree(ptdev->perf);
> +
> + ptdev->perf = NULL;
> }
> diff --git a/drivers/gpu/drm/panthor/panthor_perf.h b/drivers/gpu/drm/panthor/panthor_perf.h
> index 3c32c24c164c..e4805727b9e7 100644
> --- a/drivers/gpu/drm/panthor/panthor_perf.h
> +++ b/drivers/gpu/drm/panthor/panthor_perf.h
> @@ -10,6 +10,7 @@
> struct panthor_device;
>
> int panthor_perf_init(struct panthor_device *ptdev);
> +void panthor_perf_unplug(struct panthor_device *ptdev);
>
> #endif /* __PANTHOR_PERF_H__ */
>
next prev parent reply other threads:[~2025-12-18 10:33 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-15 17:14 [PATCH v6 0/7] Performance counter implementation with single manual client support Lukas Zapolskas
2025-12-15 17:14 ` [PATCH v6 1/7] drm/panthor: Add performance counter uAPI Lukas Zapolskas
2025-12-16 10:59 ` Boris Brezillon
2025-12-16 17:30 ` Boris Brezillon
2026-01-07 15:14 ` Lukas Zapolskas
2025-12-17 14:37 ` Boris Brezillon
2026-01-07 15:13 ` Lukas Zapolskas
2026-01-07 15:32 ` Boris Brezillon
2025-12-22 18:15 ` kernel test robot
2026-01-14 13:06 ` Boris Brezillon
2025-12-15 17:14 ` [PATCH v6 2/7] drm/panthor: Add DEV_QUERY.PERF_INFO handling for Gx10 Lukas Zapolskas
2026-01-14 10:11 ` Boris Brezillon
2025-12-15 17:14 ` [PATCH v6 3/7] drm/panthor: Add panthor perf initialization and termination Lukas Zapolskas
2025-12-18 10:33 ` Boris Brezillon [this message]
2025-12-18 10:37 ` Boris Brezillon
2025-12-18 13:30 ` Boris Brezillon
2025-12-15 17:14 ` [PATCH v6 4/7] drm/panthor: Introduce sampling sessions to handle userspace clients Lukas Zapolskas
2026-01-14 12:07 ` Boris Brezillon
2026-05-26 16:36 ` Nicolas Frattaroli
2025-12-15 17:14 ` [PATCH v6 5/7] drm/panthor: Implement the counter sampler and sample handling Lukas Zapolskas
2025-12-20 14:34 ` kernel test robot
2025-12-21 5:13 ` kernel test robot
2026-01-13 16:19 ` Boris Brezillon
2025-12-15 17:14 ` [PATCH v6 6/7] drm/panthor: Add suspend, resume and reset handling Lukas Zapolskas
2025-12-15 17:14 ` [PATCH v6 7/7] drm/panthor: Expose the panthor perf ioctls Lukas Zapolskas
2026-05-18 17:00 ` Erik Faye-Lund
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251218113318.774e18c6@fedora \
--to=boris.brezillon@collabora.com \
--cc=adrian.larumbe@collabora.com \
--cc=airlied@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=liviu.dudau@arm.com \
--cc=lukas.zapolskas@arm.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mihail.atanassov@arm.com \
--cc=mripard@kernel.org \
--cc=nd@arm.com \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.