[PATCH 2/2] drm/vc4: Stop the active perfmon before being destroyed

Juan A. Suárez jasuarez at igalia.com
Fri Oct 4 16:25:45 UTC 2024


Worth to mention we got this issue happened also for v3d (a fix was
already submitted).


Reviewed-by: Juan A. Suarez <jasuarez at igalia.com>


On Fri, 2024-10-04 at 09:36 -0300, Maíra Canal wrote:
> Upon closing the file descriptor, the active performance monitor is
> not
> stopped. Although all perfmons are destroyed in
> `vc4_perfmon_close_file()`,
> the active performance monitor's pointer (`vc4->active_perfmon`) is
> still
> retained.
> 
> If we open a new file descriptor and submit a few jobs with
> performance
> monitors, the driver will attempt to stop the active performance
> monitor
> using the stale pointer in `vc4->active_perfmon`. However, this
> pointer
> is no longer valid because the previous process has already
> terminated,
> and all performance monitors associated with it have been destroyed
> and
> freed.
> 
> To fix this, when the active performance monitor belongs to a given
> process, explicitly stop it before destroying and freeing it.
> 
> Cc: <stable at vger.kernel.org> # v4.17+
> Cc: Boris Brezillon <bbrezillon at kernel.org>
> Cc: Juan A. Suarez Romero <jasuarez at igalia.com>
> Fixes: 65101d8c9108 ("drm/vc4: Expose performance counters to
> userspace")
> Signed-off-by: Maíra Canal <mcanal at igalia.com>
> ---
>  drivers/gpu/drm/vc4/vc4_perfmon.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/vc4/vc4_perfmon.c
> b/drivers/gpu/drm/vc4/vc4_perfmon.c
> index f2e56d0f6298..f1342f917cf7 100644
> --- a/drivers/gpu/drm/vc4/vc4_perfmon.c
> +++ b/drivers/gpu/drm/vc4/vc4_perfmon.c
> @@ -116,6 +116,11 @@ void vc4_perfmon_open_file(struct vc4_file
> *vc4file)
>  static int vc4_perfmon_idr_del(int id, void *elem, void *data)
>  {
>  	struct vc4_perfmon *perfmon = elem;
> +	struct vc4_dev *vc4 = (struct vc4_dev *)data;
> +
> +	/* If the active perfmon is being destroyed, stop it first
> */
> +	if (perfmon == vc4->active_perfmon)
> +		vc4_perfmon_stop(vc4, perfmon, false);
>  
>  	vc4_perfmon_put(perfmon);
>  
> @@ -130,7 +135,7 @@ void vc4_perfmon_close_file(struct vc4_file
> *vc4file)
>  		return;
>  
>  	mutex_lock(&vc4file->perfmon.lock);
> -	idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del,
> NULL);
> +	idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del,
> vc4);
>  	idr_destroy(&vc4file->perfmon.idr);
>  	mutex_unlock(&vc4file->perfmon.lock);
>  	mutex_destroy(&vc4file->perfmon.lock);



More information about the dri-devel mailing list