From: Boris Brezillon <boris.brezillon@collabora.com>
To: "Adrián Larumbe" <adrian.larumbe@collabora.com>
Cc: "Steven Price" <steven.price@arm.com>,
"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>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
kernel@collabora.com, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linaro-mm-sig@lists.linaro.org
Subject: Re: [PATCH v6 3/5] drm/panthor: add DRM fdinfo support
Date: Fri, 13 Sep 2024 16:15:24 +0200 [thread overview]
Message-ID: <20240913161524.6cb47b91@collabora.com> (raw)
In-Reply-To: <20240913124857.389630-4-adrian.larumbe@collabora.com>
On Fri, 13 Sep 2024 13:42:11 +0100
Adrián Larumbe <adrian.larumbe@collabora.com> wrote:
> Drawing from the FW-calculated values in a previous commit, we can increase
> the numbers for an open file by collecting them from finished jobs when
> updating their group synchronisation objects.
>
> Display of fdinfo key-value pairs is governed by a bitmask that is by
> default unset in the present commit, and supporting manual toggle of it
> will be the matter of a later commit.
>
> Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
> Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> drivers/gpu/drm/panthor/panthor_device.h | 8 ++++
> drivers/gpu/drm/panthor/panthor_drv.c | 34 ++++++++++++++
> drivers/gpu/drm/panthor/panthor_sched.c | 56 ++++++++++++++++++++++++
> drivers/gpu/drm/panthor/panthor_sched.h | 2 +
> 4 files changed, 100 insertions(+)
>
> diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
> index 2109905813e8..0e68f5a70d20 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.h
> +++ b/drivers/gpu/drm/panthor/panthor_device.h
> @@ -192,6 +192,11 @@ struct panthor_device {
> unsigned long fast_rate;
> };
>
> +struct panthor_gpu_usage {
> + u64 time;
> + u64 cycles;
> +};
> +
> /**
> * struct panthor_file - Panthor file
> */
> @@ -204,6 +209,9 @@ struct panthor_file {
>
> /** @groups: Scheduling group pool attached to this file. */
> struct panthor_group_pool *groups;
> +
> + /** @stats: cycle and timestamp measures for job execution. */
> + struct panthor_gpu_usage stats;
> };
>
> int panthor_device_init(struct panthor_device *ptdev);
> diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
> index 0caf9e9a8c45..233b265c0819 100644
> --- a/drivers/gpu/drm/panthor/panthor_drv.c
> +++ b/drivers/gpu/drm/panthor/panthor_drv.c
> @@ -13,6 +13,7 @@
> #include <linux/pagemap.h>
> #include <linux/platform_device.h>
> #include <linux/pm_runtime.h>
> +#include <linux/time64.h>
>
> #include <drm/drm_auth.h>
> #include <drm/drm_debugfs.h>
> @@ -1414,6 +1415,37 @@ static int panthor_mmap(struct file *filp, struct vm_area_struct *vma)
> return ret;
> }
>
> +static void panthor_gpu_show_fdinfo(struct panthor_device *ptdev,
> + struct panthor_file *pfile,
> + struct drm_printer *p)
> +{
> + if (ptdev->profile_mask & PANTHOR_DEVICE_PROFILING_ALL)
> + panthor_fdinfo_gather_group_samples(pfile);
> +
> + if (ptdev->profile_mask & PANTHOR_DEVICE_PROFILING_TIMESTAMP) {
> +#ifdef CONFIG_ARM_ARCH_TIMER
> + drm_printf(p, "drm-engine-panthor:\t%llu ns\n",
> + DIV_ROUND_UP_ULL((pfile->stats.time * NSEC_PER_SEC),
> + arch_timer_get_cntfrq()));
> +#endif
> + }
> + if (ptdev->profile_mask & PANTHOR_DEVICE_PROFILING_CYCLES)
> + drm_printf(p, "drm-cycles-panthor:\t%llu\n", pfile->stats.cycles);
> +
> + drm_printf(p, "drm-maxfreq-panthor:\t%lu Hz\n", ptdev->fast_rate);
> + drm_printf(p, "drm-curfreq-panthor:\t%lu Hz\n", ptdev->current_frequency);
> +}
> +
> +static void panthor_show_fdinfo(struct drm_printer *p, struct drm_file *file)
> +{
> + struct drm_device *dev = file->minor->dev;
> + struct panthor_device *ptdev = container_of(dev, struct panthor_device, base);
> +
> + panthor_gpu_show_fdinfo(ptdev, file->driver_priv, p);
> +
> + drm_show_memory_stats(p, file);
> +}
> +
> static const struct file_operations panthor_drm_driver_fops = {
> .open = drm_open,
> .release = drm_release,
> @@ -1423,6 +1455,7 @@ static const struct file_operations panthor_drm_driver_fops = {
> .read = drm_read,
> .llseek = noop_llseek,
> .mmap = panthor_mmap,
> + .show_fdinfo = drm_show_fdinfo,
> };
>
> #ifdef CONFIG_DEBUG_FS
> @@ -1442,6 +1475,7 @@ static const struct drm_driver panthor_drm_driver = {
> DRIVER_SYNCOBJ_TIMELINE | DRIVER_GEM_GPUVA,
> .open = panthor_open,
> .postclose = panthor_postclose,
> + .show_fdinfo = panthor_show_fdinfo,
> .ioctls = panthor_drm_driver_ioctls,
> .num_ioctls = ARRAY_SIZE(panthor_drm_driver_ioctls),
> .fops = &panthor_drm_driver_fops,
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c
> index bcba52558f1e..d822bf9b59fa 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.c
> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
> @@ -619,6 +619,18 @@ struct panthor_group {
> */
> struct panthor_kernel_bo *syncobjs;
>
> + /** @fdinfo: Per-file total cycle and timestamp values reference. */
> + struct {
> + /** @data: Total sampled values for jobs in queues from this group. */
> + struct panthor_gpu_usage data;
> +
> + /**
> + * @lock: Mutex to govern concurrent access from drm file's fdinfo callback
> + * and job post-completion processing function
> + */
> + struct mutex lock;
> + } fdinfo;
> +
> /** @state: Group state. */
> enum panthor_group_state state;
>
> @@ -889,6 +901,8 @@ static void group_release_work(struct work_struct *work)
> release_work);
> u32 i;
>
> + mutex_destroy(&group->fdinfo.lock);
> +
> for (i = 0; i < group->queue_count; i++)
> group_free_queue(group, group->queues[i]);
>
> @@ -2811,6 +2825,44 @@ void panthor_sched_post_reset(struct panthor_device *ptdev, bool reset_failed)
> }
> }
>
> +static void update_fdinfo_stats(struct panthor_job *job)
> +{
> + struct panthor_group *group = job->group;
> + struct panthor_queue *queue = group->queues[job->queue_idx];
> + struct panthor_gpu_usage *fdinfo = &group->fdinfo.data;
> + struct panthor_job_profiling_data *times;
> +
> + times = (struct panthor_job_profiling_data *)
> + ((unsigned long) queue->profiling.slots->kmap +
> + (job->profiling.slot * sizeof(struct panthor_job_profiling_data)));
> +
> + mutex_lock(&group->fdinfo.lock);
> + if (job->profiling.mask & PANTHOR_DEVICE_PROFILING_CYCLES)
> + fdinfo->cycles += times->cycles.after - times->cycles.before;
> + if (job->profiling.mask & PANTHOR_DEVICE_PROFILING_TIMESTAMP)
> + fdinfo->time += times->time.after - times->time.before;
> + mutex_unlock(&group->fdinfo.lock);
> +}
> +
> +void panthor_fdinfo_gather_group_samples(struct panthor_file *pfile)
> +{
> + struct panthor_group_pool *gpool = pfile->groups;
> + struct panthor_group *group;
> + unsigned long i;
> +
> + if (IS_ERR_OR_NULL(gpool))
> + return;
> +
> + xa_for_each(&gpool->xa, i, group) {
> + mutex_lock(&group->fdinfo.lock);
> + pfile->stats.cycles += group->fdinfo.data.cycles;
> + pfile->stats.time += group->fdinfo.data.time;
> + group->fdinfo.data.cycles = 0;
> + group->fdinfo.data.time = 0;
> + mutex_unlock(&group->fdinfo.lock);
> + }
> +}
> +
> static void group_sync_upd_work(struct work_struct *work)
> {
> struct panthor_group *group =
> @@ -2843,6 +2895,8 @@ static void group_sync_upd_work(struct work_struct *work)
> dma_fence_end_signalling(cookie);
>
> list_for_each_entry_safe(job, job_tmp, &done_jobs, node) {
> + if (job->profiling.mask)
> + update_fdinfo_stats(job);
> list_del_init(&job->node);
> panthor_job_put(&job->base);
> }
> @@ -3440,6 +3494,8 @@ int panthor_group_create(struct panthor_file *pfile,
> }
> mutex_unlock(&sched->reset.lock);
>
> + mutex_init(&group->fdinfo.lock);
> +
> return gid;
>
> err_put_group:
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.h b/drivers/gpu/drm/panthor/panthor_sched.h
> index 3a30d2328b30..5ae6b4bde7c5 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.h
> +++ b/drivers/gpu/drm/panthor/panthor_sched.h
> @@ -47,4 +47,6 @@ void panthor_sched_resume(struct panthor_device *ptdev);
> void panthor_sched_report_mmu_fault(struct panthor_device *ptdev);
> void panthor_sched_report_fw_events(struct panthor_device *ptdev, u32 events);
>
> +void panthor_fdinfo_gather_group_samples(struct panthor_file *pfile);
> +
> #endif
next prev parent reply other threads:[~2024-09-13 14:15 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-13 12:42 [PATCH v6 0/5] Support fdinfo runtime and memory stats on Panthor Adrián Larumbe
2024-09-13 12:42 ` [PATCH v6 1/5] drm/panthor: introduce job cycle and timestamp accounting Adrián Larumbe
2024-09-13 21:53 ` kernel test robot
2024-09-15 15:22 ` kernel test robot
2024-09-15 16:43 ` kernel test robot
2024-09-16 11:15 ` Steven Price
2024-09-20 22:36 ` Adrián Larumbe
2024-09-23 8:55 ` Steven Price
2024-09-23 20:43 ` Adrián Larumbe
2024-09-25 9:56 ` Steven Price
2024-09-27 14:53 ` Adrián Larumbe
2024-09-30 11:28 ` Steven Price
2024-09-13 12:42 ` [PATCH v6 2/5] drm/panthor: record current and maximum device clock frequencies Adrián Larumbe
2024-09-13 14:14 ` Boris Brezillon
2024-09-16 11:19 ` Steven Price
2024-09-13 12:42 ` [PATCH v6 3/5] drm/panthor: add DRM fdinfo support Adrián Larumbe
2024-09-13 14:15 ` Boris Brezillon [this message]
2024-09-13 12:42 ` [PATCH v6 4/5] drm/panthor: enable fdinfo for memory stats Adrián Larumbe
2024-09-13 12:42 ` [PATCH v6 5/5] drm/panthor: add sysfs knob for enabling job profiling Adrián Larumbe
2024-09-13 14:15 ` Boris Brezillon
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=20240913161524.6cb47b91@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=adrian.larumbe@collabora.com \
--cc=airlied@gmail.com \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=kernel@collabora.com \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=liviu.dudau@arm.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=simona@ffwll.ch \
--cc=steven.price@arm.com \
--cc=sumit.semwal@linaro.org \
--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.