Re: [PATCH v3 5/8] drm/vc4: Refcount vc4_file for safe access by jobs

Tvrtko Ursulin <[email protected]>
Newsgroups org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
On 12/07/2026 16:14, Maíra Canal wrote:
> This is a preparation commit for per-file descriptor seqno tracking,
> which will require the struct vc4_render_job to store a pointer to
> vc4_file. Since the scheduler's free_job callback runs asynchronously,
> it can execute after vc4_close() has already freed the vc4_file, causing
> a use-after-free.
> 
> Add kref-based reference counting to vc4_file so that jobs can safely
> take a reference at submit time via vc4_file_get() and drop it in their
> free callback via vc4_file_put().
> 
> Signed-off-by: Maíra Canal <[email protected]>
> ---
>   drivers/gpu/drm/vc4/vc4_drv.c | 12 ++++++++++--
>   drivers/gpu/drm/vc4/vc4_drv.h | 17 +++++++++++++++++
>   2 files changed, 27 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
> index cacd4cb94259..6c49304301c9 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.c
> +++ b/drivers/gpu/drm/vc4/vc4_drv.c
> @@ -167,6 +167,7 @@ static int vc4_open(struct drm_device *dev, struct drm_file *file)
>   			goto err_sched;
>   	}
>   
> +	kref_init(&vc4file->refcount);
>   	vc4_perfmon_open_file(vc4file);
>   	file->driver_priv = vc4file;
>   
> @@ -180,6 +181,14 @@ static int vc4_open(struct drm_device *dev, struct drm_file *file)
>   
>   }
>   
> +void vc4_file_release(struct kref *ref)
> +{
> +	struct vc4_file *vc4file = container_of(ref, struct vc4_file, refcount);
> +
> +	vc4_perfmon_close_file(vc4file);
> +	kfree(vc4file);
> +}
> +
>   static void vc4_close(struct drm_device *dev, struct drm_file *file)
>   {
>   	struct vc4_dev *vc4 = to_vc4_dev(dev);
> @@ -195,8 +204,7 @@ static void vc4_close(struct drm_device *dev, struct drm_file *file)
>   	for (q = 0; q < VC4_MAX_QUEUES; q++)
>   		drm_sched_entity_destroy(&vc4file->sched_entity[q]);
>   
> -	vc4_perfmon_close_file(vc4file);
> -	kfree(vc4file);
> +	vc4_file_put(vc4file);
>   }
>   
>   DEFINE_DRM_GEM_FOPS(vc4_drm_fops);
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
> index 255a95f55586..4f452ea3b4a6 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.h
> +++ b/drivers/gpu/drm/vc4/vc4_drv.h
> @@ -905,6 +905,8 @@ struct vc4_exec_info {
>   struct vc4_file {
>   	struct vc4_dev *dev;
>   
> +	struct kref refcount;
> +
>   	struct xarray perfmons;
>   
>   	struct drm_sched_entity sched_entity[VC4_MAX_QUEUES];
> @@ -1092,6 +1094,21 @@ static inline void vc4_debugfs_add_regset32(struct drm_device *drm,
>   /* vc4_drv.c */
>   void __iomem *vc4_ioremap_regs(struct platform_device *dev, int index);
>   int vc4_dumb_fixup_args(struct drm_mode_create_dumb *args);
> +void vc4_file_release(struct kref *ref);
> +
> +static inline
> +struct vc4_file *vc4_file_get(struct vc4_file *vc4file)
> +{
> +	kref_get(&vc4file->refcount);
> +	return vc4file;
> +}
> +
> +static inline
> +void vc4_file_put(struct vc4_file *vc4file)
> +{
> +	kref_put(&vc4file->refcount, vc4_file_release);
> +}
> +
>   
>   /* vc4_dpi.c */
>   extern struct platform_driver vc4_dpi_driver;
> 

Reviewed-by: Tvrtko Ursulin <[email protected]>

Regards,

Tvrtko
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.