All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Chia-I Wu <olvaffe@gmail.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>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/4] panthor: save panthor_file in panthor_group
Date: Mon, 23 Jun 2025 08:21:22 +0200	[thread overview]
Message-ID: <20250623082122.62f69579@fedora> (raw)
In-Reply-To: <20250620235053.164614-3-olvaffe@gmail.com>

On Fri, 20 Jun 2025 16:50:51 -0700
Chia-I Wu <olvaffe@gmail.com> wrote:

> We would like to access panthor_file from panthor_group on gpu errors.
> Because panthour_group can outlive drm_file, add refcount to
> panthor_file to ensure its lifetime.

I'm not a huge fan of refcounting panthor_file because people tend to
put resource they expect to be released when the last handle goes away,
and if we don't refcount these sub-resources they might live longer
than they are meant to. Also not a huge fan of the circular referencing
that exists between file and groups after this change.

How about we move the process info to a sub-object that's refcounted
and let both panthor_file and panthor_group take a ref on this object
instead?

> 
> Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
> ---
>  drivers/gpu/drm/panthor/panthor_device.h | 16 ++++++++++++++++
>  drivers/gpu/drm/panthor/panthor_drv.c    | 15 ++++++++++++++-
>  drivers/gpu/drm/panthor/panthor_mmu.c    |  1 +
>  drivers/gpu/drm/panthor/panthor_sched.c  |  6 ++++++
>  4 files changed, 37 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
> index 4fc7cf2aeed57..75ae6fd3a5128 100644
> --- a/drivers/gpu/drm/panthor/panthor_device.h
> +++ b/drivers/gpu/drm/panthor/panthor_device.h
> @@ -256,8 +256,24 @@ struct panthor_file {
>  
>  	/** @stats: cycle and timestamp measures for job execution. */
>  	struct panthor_gpu_usage stats;
> +
> +	/** @refcount: ref count of this file */
> +	struct kref refcount;
>  };
>  
> +static inline struct panthor_file *panthor_file_get(struct panthor_file *pfile)
> +{
> +	kref_get(&pfile->refcount);
> +	return pfile;
> +}
> +
> +void panthor_file_release(struct kref *kref);
> +
> +static inline void panthor_file_put(struct panthor_file *pfile)
> +{
> +	kref_put(&pfile->refcount, panthor_file_release);
> +}
> +
>  int panthor_device_init(struct panthor_device *ptdev);
>  void panthor_device_unplug(struct panthor_device *ptdev);
>  
> diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
> index 775a66c394544..aea9609684b77 100644
> --- a/drivers/gpu/drm/panthor/panthor_drv.c
> +++ b/drivers/gpu/drm/panthor/panthor_drv.c
> @@ -1393,6 +1393,16 @@ static int panthor_ioctl_set_user_mmio_offset(struct drm_device *ddev,
>  	return 0;
>  }
>  
> +void panthor_file_release(struct kref *kref)
> +{
> +	struct panthor_file *pfile =
> +		container_of(kref, struct panthor_file, refcount);
> +
> +	WARN_ON(pfile->vms || pfile->groups);
> +
> +	kfree(pfile);
> +}
> +
>  static int
>  panthor_open(struct drm_device *ddev, struct drm_file *file)
>  {
> @@ -1426,6 +1436,8 @@ panthor_open(struct drm_device *ddev, struct drm_file *file)
>  	if (ret)
>  		goto err_destroy_vm_pool;
>  
> +	kref_init(&pfile->refcount);
> +
>  	file->driver_priv = pfile;
>  	return 0;
>  
> @@ -1442,10 +1454,11 @@ panthor_postclose(struct drm_device *ddev, struct drm_file *file)
>  {
>  	struct panthor_file *pfile = file->driver_priv;
>  
> +	/* destroy vm and group handles now to avoid circular references */
>  	panthor_group_pool_destroy(pfile);
>  	panthor_vm_pool_destroy(pfile);
>  
> -	kfree(pfile);
> +	panthor_file_put(pfile);
>  }
>  
>  static const struct drm_ioctl_desc panthor_drm_driver_ioctls[] = {
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
> index b39ea6acc6a96..ccbcfe11420ac 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> @@ -1604,6 +1604,7 @@ void panthor_vm_pool_destroy(struct panthor_file *pfile)
>  
>  	xa_destroy(&pfile->vms->xa);
>  	kfree(pfile->vms);
> +	pfile->vms = NULL;
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c
> index a2248f692a030..485072904cd7d 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.c
> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
> @@ -535,6 +535,9 @@ struct panthor_group {
>  	/** @ptdev: Device. */
>  	struct panthor_device *ptdev;
>  
> +	/** @pfile: File this group is created from. */
> +	struct panthor_file *pfile;
> +
>  	/** @vm: VM bound to the group. */
>  	struct panthor_vm *vm;
>  
> @@ -919,6 +922,7 @@ static void group_release_work(struct work_struct *work)
>  	panthor_kernel_bo_destroy(group->syncobjs);
>  
>  	panthor_vm_put(group->vm);
> +	panthor_file_put(group->pfile);
>  	kfree(group);
>  }
>  
> @@ -3467,6 +3471,8 @@ int panthor_group_create(struct panthor_file *pfile,
>  	INIT_WORK(&group->tiler_oom_work, group_tiler_oom_work);
>  	INIT_WORK(&group->release_work, group_release_work);
>  
> +	group->pfile = panthor_file_get(pfile);
> +
>  	group->vm = panthor_vm_pool_get_vm(pfile->vms, group_args->vm_id);
>  	if (!group->vm) {
>  		ret = -EINVAL;


  reply	other threads:[~2025-06-23  6:21 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-20 23:50 [PATCH 0/4] panthor: print task pid and comm on gpu errors Chia-I Wu
2025-06-20 23:50 ` [PATCH 1/4] panthor: set owner field for driver fops Chia-I Wu
2025-06-23  6:16   ` Boris Brezillon
2025-06-23  8:42   ` Steven Price
2025-06-20 23:50 ` [PATCH 2/4] panthor: save panthor_file in panthor_group Chia-I Wu
2025-06-23  6:21   ` Boris Brezillon [this message]
2025-06-23  9:07     ` Liviu Dudau
2025-07-13  3:12       ` Chia-I Wu
2025-06-20 23:50 ` [PATCH 3/4] panthor: save task pid and comm in panthor_file Chia-I Wu
2025-06-20 23:50 ` [PATCH 4/4] panthor: dump task pid and comm on gpu errors Chia-I Wu

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=20250623082122.62f69579@fedora \
    --to=boris.brezillon@collabora.com \
    --cc=airlied@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=liviu.dudau@arm.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=olvaffe@gmail.com \
    --cc=steven.price@arm.com \
    --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.