Linux Media Controller development
 help / color / mirror / Atom feed
From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org, Hans Verkuil <hverkuil-cisco@xs4all.nl>
Subject: Re: [PATCH v2 18/29] media: mc: Postpone graph object removal until free
Date: Tue, 4 Jun 2024 10:59:49 +0000	[thread overview]
Message-ID: <Zl7zpctzVHO1BGL5@kekkonen.localdomain> (raw)
In-Reply-To: <20240207141820.GP23702@pendragon.ideasonboard.com>

Hi Laurent,

Thanks for the comments. Apologies for missing this earlier.

On Wed, Feb 07, 2024 at 04:18:20PM +0200, Laurent Pinchart wrote:
> Hi Sakari,
> 
> Thank you for the patch.
> 
> On Wed, Dec 20, 2023 at 12:37:02PM +0200, Sakari Ailus wrote:
> > The media device itself will be unregistered based on it being unbound and
> > driver's remove callback being called. The graph objects themselves may
> > still be in use; rely on the media device release callback to release
> > them.
> > 
> > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
> > ---
> >  drivers/media/mc/mc-device.c | 53 +++++++++++++++++-------------------
> >  1 file changed, 25 insertions(+), 28 deletions(-)
> > 
> > diff --git a/drivers/media/mc/mc-device.c b/drivers/media/mc/mc-device.c
> > index bbc233e726d2..10426c2796b6 100644
> > --- a/drivers/media/mc/mc-device.c
> > +++ b/drivers/media/mc/mc-device.c
> > @@ -702,8 +702,33 @@ EXPORT_SYMBOL_GPL(media_device_unregister_entity_notify);
> >  
> >  static void __media_device_release(struct media_device *mdev)
> >  {
> > +	struct media_entity *entity;
> > +	struct media_entity *next;
> > +	struct media_interface *intf, *tmp_intf;
> > +	struct media_entity_notify *notify, *nextp;
> > +
> >  	dev_dbg(mdev->dev, "Media device released\n");
> 
> No need for locking ? I suppose we can't reach this point if someone
> else has a reference to the media device. A comment to mention it would
> be nice.

There's indeed no point in locking a mutex in memory that's about to get
released. In fact, the mutex is about to get destroyed first. Other release
callback don't have comments, although the purpose of
__media_device_release wasn't that of an ordinary release callback. Still,
bygones are bygones.

> 
> >  
> > +	/* Remove all entities from the media device */
> > +	list_for_each_entry_safe(entity, next, &mdev->entities, graph_obj.list)
> > +		__media_device_unregister_entity(entity);
> 
> Should the __media_device_unregister_entity() function be renamed to
> __media_device_remove_entity() (in a separate patch) ? Same for
> __media_device_unregister_entity_notify().

"unregister" pairs with "register" so at least for now I'd prefer to keep
the naming as-is. I'm fine discussing the naming after this set though.

> 
> > +
> > +	/* Remove all entity_notify callbacks from the media device */
> > +	list_for_each_entry_safe(notify, nextp, &mdev->entity_notify, list)
> > +		__media_device_unregister_entity_notify(mdev, notify);
> > +
> > +	/* Remove all interfaces from the media device */
> > +	list_for_each_entry_safe(intf, tmp_intf, &mdev->interfaces,
> > +				 graph_obj.list) {
> > +		/*
> > +		 * Unlink the interface, but don't free it here; the
> > +		 * module which created it is responsible for freeing
> > +		 * it
> > +		 */
> > +		__media_remove_intf_links(intf);
> > +		media_gobj_destroy(&intf->graph_obj);
> > +	}
> > +
> >  	ida_destroy(&mdev->entity_internal_idx);
> >  	mdev->entity_internal_idx_max = 0;
> >  	media_graph_walk_cleanup(&mdev->pm_count_walk);
> > @@ -787,42 +812,14 @@ EXPORT_SYMBOL_GPL(__media_device_register);
> >  
> >  void media_device_unregister(struct media_device *mdev)
> >  {
> > -	struct media_entity *entity;
> > -	struct media_entity *next;
> > -	struct media_interface *intf, *tmp_intf;
> > -	struct media_entity_notify *notify, *nextp;
> > -
> >  	if (mdev == NULL)
> >  		return;
> >  
> >  	mutex_lock(&mdev->graph_mutex);
> > -
> > -	/* Check if mdev was ever registered at all */
> >  	if (!media_devnode_is_registered(&mdev->devnode)) {
> >  		mutex_unlock(&mdev->graph_mutex);
> 
> Unless I'm mistaken we don't need to lock the graph mutext to test this,
> so I think you can drop locking completely here.

There may be IOCTL calls in progress while unregister takes place. The test
seems to be fine outside the lock but the section below still needs the
lock.

I'll change this for v4.

> 
> >  		return;
> >  	}
> > -
> > -	/* Remove all entities from the media device */
> > -	list_for_each_entry_safe(entity, next, &mdev->entities, graph_obj.list)
> > -		__media_device_unregister_entity(entity);
> > -
> > -	/* Remove all entity_notify callbacks from the media device */
> > -	list_for_each_entry_safe(notify, nextp, &mdev->entity_notify, list)
> > -		__media_device_unregister_entity_notify(mdev, notify);
> > -
> > -	/* Remove all interfaces from the media device */
> > -	list_for_each_entry_safe(intf, tmp_intf, &mdev->interfaces,
> > -				 graph_obj.list) {
> > -		/*
> > -		 * Unlink the interface, but don't free it here; the
> > -		 * module which created it is responsible for freeing
> > -		 * it
> > -		 */
> > -		__media_remove_intf_links(intf);
> > -		media_gobj_destroy(&intf->graph_obj);
> > -	}
> > -
> >  	mutex_unlock(&mdev->graph_mutex);
> >  
> >  	device_remove_file(&mdev->devnode.dev, &dev_attr_model);
> 

-- 
Kind regards,

Sakari Ailus

  reply	other threads:[~2024-06-04 10:59 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-20 10:36 [PATCH v2 00/29] Media device lifetime management Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 01/29] Revert "[media] media: fix media devnode ioctl/syscall and unregister race" Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 02/29] Revert "media: utilize new cdev_device_add helper function" Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 03/29] Revert "[media] media: fix use-after-free in cdev_put() when app exits after driver unbind" Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 04/29] media: mc: utilize new cdev_device_add helper function Sakari Ailus
2024-02-07  9:38   ` Laurent Pinchart
2024-02-07  9:51     ` Laurent Pinchart
2024-02-21 12:55       ` Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 05/29] Revert "media: uvcvideo: Refactor teardown of uvc on USB disconnect" Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 06/29] Revert "[media] media-device: dynamically allocate struct media_devnode" Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 07/29] media: uvcvideo: Refactor teardown of uvc on USB disconnect Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 08/29] media: mc: Drop nop release callback Sakari Ailus
2024-02-07  9:55   ` Laurent Pinchart
2023-12-20 10:36 ` [PATCH v2 09/29] media: mc: Do not call cdev_device_del() if cdev_device_add() fails Sakari Ailus
2024-02-07  9:57   ` Laurent Pinchart
2024-03-05  8:13     ` Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 10/29] media: mc: Delete character device early Sakari Ailus
2024-02-07 10:08   ` Laurent Pinchart
2024-03-05  8:52     ` Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 11/29] media: mc: Split initialising and adding media devnode Sakari Ailus
2024-02-07 10:46   ` Laurent Pinchart
2024-03-05  8:59     ` Sakari Ailus
2023-12-20 10:36 ` [PATCH v2 12/29] media: mc: Shuffle functions around Sakari Ailus
2024-02-07 10:47   ` Laurent Pinchart
2023-12-20 10:36 ` [PATCH v2 13/29] media: mc: Initialise media devnode in media_device_init() Sakari Ailus
2024-02-07 10:51   ` Laurent Pinchart
2023-12-20 10:36 ` [PATCH v2 14/29] media: mc: Refactor media devnode minor clearing Sakari Ailus
2024-02-05 14:46   ` Hans Verkuil
2024-02-07 10:53   ` Laurent Pinchart
2023-12-20 10:36 ` [PATCH v2 15/29] media: mc: Unassign minor only if it has been assigned Sakari Ailus
2024-02-05 14:48   ` Hans Verkuil
2024-02-07 10:58   ` Laurent Pinchart
2024-02-21  9:24     ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 16/29] media: mc: Refcount the media device Sakari Ailus
2024-02-07 11:08   ` Laurent Pinchart
2024-03-07 10:37     ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 17/29] media: v4l: Acquire a reference to the media device for every video device Sakari Ailus
2024-02-05 14:56   ` Hans Verkuil
2024-02-07 11:13     ` Laurent Pinchart
2024-02-21 10:43       ` Sakari Ailus
2024-02-21 12:19         ` Laurent Pinchart
2024-02-21 12:35           ` Sakari Ailus
2024-02-21 10:40     ` Sakari Ailus
2024-02-21 10:51       ` Hans Verkuil
2024-02-21 11:44         ` Sakari Ailus
2024-03-05  7:43           ` Sakari Ailus
2024-03-05  7:46             ` Hans Verkuil
2023-12-20 10:37 ` [PATCH v2 18/29] media: mc: Postpone graph object removal until free Sakari Ailus
2024-02-07 14:18   ` Laurent Pinchart
2024-06-04 10:59     ` Sakari Ailus [this message]
2024-06-04 11:01       ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 19/29] media: omap3isp: Release the isp device struct by media device callback Sakari Ailus
2024-02-07 14:23   ` Laurent Pinchart
2024-06-05  9:23     ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 20/29] media: ipu3-cio2: Call v4l2_device_unregister() earlier Sakari Ailus
2024-02-07 14:24   ` Laurent Pinchart
2024-03-05 10:21     ` Sakari Ailus
2024-03-05 10:22       ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 21/29] media: ipu3-cio2: Request IRQ earlier Sakari Ailus
2024-02-05 14:58   ` Hans Verkuil
2024-02-07 14:34     ` Laurent Pinchart
2024-02-21 10:51       ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 22/29] media: ipu3-cio2: Release the cio2 device context by media device callback Sakari Ailus
2024-02-07 14:33   ` Laurent Pinchart
2024-03-07 12:23     ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 23/29] media: vimc: Release resources on media device release Sakari Ailus
2024-02-05 15:02   ` Hans Verkuil
2024-02-07 14:38     ` Laurent Pinchart
2024-02-21 10:55       ` Sakari Ailus
2024-02-21 10:53     ` Sakari Ailus
2024-02-21 11:02       ` Laurent Pinchart
2024-02-21 11:38         ` Sakari Ailus
2024-02-21 11:19       ` Hans Verkuil
2024-02-21 11:40         ` Sakari Ailus
2024-02-21 11:48           ` Hans Verkuil
2024-02-21 12:02             ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 24/29] media: Documentation: Document how Media device resources are released Sakari Ailus
2024-02-05 15:04   ` Hans Verkuil
2024-02-07 14:43   ` Laurent Pinchart
2024-02-21 11:37     ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 25/29] media: mc: Add per-file-handle data support Sakari Ailus
2024-02-05 15:08   ` Hans Verkuil
2023-12-20 10:37 ` [PATCH v2 26/29] media: mc: Maintain a list of open file handles in a media device Sakari Ailus
2024-02-05 15:11   ` Hans Verkuil
2024-02-05 15:16     ` Laurent Pinchart
2024-02-05 15:32       ` Hans Verkuil
2024-02-05 15:41         ` Laurent Pinchart
2024-02-21 11:53           ` Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 27/29] media: mc: Implement best effort media device removal safety sans refcount Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 28/29] media: mc: Warn about drivers not releasing media device safely Sakari Ailus
2023-12-20 10:37 ` [PATCH v2 29/29] media: Documentation: Document media device memory safety helper Sakari Ailus
2023-12-20 10:52 ` [PATCH v2 00/29] Media device lifetime management Laurent Pinchart
2023-12-20 11:30   ` Sakari Ailus
2024-02-07 10:55 ` Laurent Pinchart
2024-03-07 10:57   ` Sakari Ailus

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=Zl7zpctzVHO1BGL5@kekkonen.localdomain \
    --to=sakari.ailus@linux.intel.com \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox