From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>,
Mauro Carvalho Chehab <mchehab@infradead.org>,
Shuah Khan <shuahkh@osg.samsung.com>
Subject: Re: [PATCH 1/5] [media] media-device: get rid of the spinlock
Date: Fri, 25 Mar 2016 00:11:21 +0200 [thread overview]
Message-ID: <1707571.F8b41vb3Xc@avalon> (raw)
In-Reply-To: <dba4d41bdfa6bb8dc51cb0f692102919b2b7c8b4.1458129823.git.mchehab@osg.samsung.com>
On Wednesday 16 Mar 2016 09:04:02 Mauro Carvalho Chehab wrote:
> Right now, the lock schema for media_device struct is messy,
> since sometimes, it is protected via a spin lock, while, for
> media graph traversal, it is protected by a mutex.
>
> Solve this conflict by always using a mutex.
>
> As a side effect, this prevents a bug where the media notifiers
> were called at atomic context.
And as a side effect the kernel now deadlocks in MEDIA_IOC_ENUM_LINKS. I'm all
for fixing messy the lock schema, but maybe you should test patches before
merging them ?
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
> ---
> drivers/media/media-device.c | 32 ++++++++++++++------------------
> drivers/media/media-entity.c | 16 ++++++++--------
> include/media/media-device.h | 6 +-----
> 3 files changed, 23 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c
> index 6e43c95629ea..c32fa15cc76e 100644
> --- a/drivers/media/media-device.c
> +++ b/drivers/media/media-device.c
> @@ -90,17 +90,17 @@ static struct media_entity *find_entity(struct
> media_device *mdev, u32 id)
>
> id &= ~MEDIA_ENT_ID_FLAG_NEXT;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
>
> media_device_for_each_entity(entity, mdev) {
> if (((media_entity_id(entity) == id) && !next) ||
> ((media_entity_id(entity) > id) && next)) {
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> return entity;
> }
> }
>
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
>
> return NULL;
> }
> @@ -590,12 +590,12 @@ int __must_check media_device_register_entity(struct
> media_device *mdev, if (!ida_pre_get(&mdev->entity_internal_idx,
> GFP_KERNEL))
> return -ENOMEM;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
>
> ret = ida_get_new_above(&mdev->entity_internal_idx, 1,
> &entity->internal_idx);
> if (ret < 0) {
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> return ret;
> }
>
> @@ -615,9 +615,6 @@ int __must_check media_device_register_entity(struct
> media_device *mdev, (notify)->notify(entity, notify->notify_data);
> }
>
> - spin_unlock(&mdev->lock);
> -
> - mutex_lock(&mdev->graph_mutex);
> if (mdev->entity_internal_idx_max
>
> >= mdev->pm_count_walk.ent_enum.idx_max) {
>
> struct media_entity_graph new = { .top = 0 };
> @@ -680,9 +677,9 @@ void media_device_unregister_entity(struct media_entity
> *entity) if (mdev == NULL)
> return;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
> __media_device_unregister_entity(entity);
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> }
> EXPORT_SYMBOL_GPL(media_device_unregister_entity);
>
> @@ -703,7 +700,6 @@ void media_device_init(struct media_device *mdev)
> INIT_LIST_HEAD(&mdev->pads);
> INIT_LIST_HEAD(&mdev->links);
> INIT_LIST_HEAD(&mdev->entity_notify);
> - spin_lock_init(&mdev->lock);
> mutex_init(&mdev->graph_mutex);
> ida_init(&mdev->entity_internal_idx);
>
> @@ -752,9 +748,9 @@ EXPORT_SYMBOL_GPL(__media_device_register);
> int __must_check media_device_register_entity_notify(struct media_device
> *mdev, struct media_entity_notify *nptr)
> {
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
> list_add_tail(&nptr->list, &mdev->entity_notify);
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> return 0;
> }
> EXPORT_SYMBOL_GPL(media_device_register_entity_notify);
> @@ -771,9 +767,9 @@ static void
> __media_device_unregister_entity_notify(struct media_device *mdev, void
> media_device_unregister_entity_notify(struct media_device *mdev, struct
> media_entity_notify *nptr)
> {
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
> __media_device_unregister_entity_notify(mdev, nptr);
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> }
> EXPORT_SYMBOL_GPL(media_device_unregister_entity_notify);
>
> @@ -787,11 +783,11 @@ void media_device_unregister(struct media_device
> *mdev) if (mdev == NULL)
> return;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
>
> /* Check if mdev was ever registered at all */
> if (!media_devnode_is_registered(&mdev->devnode)) {
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> return;
> }
>
> @@ -811,7 +807,7 @@ void media_device_unregister(struct media_device *mdev)
> kfree(intf);
> }
>
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
>
> device_remove_file(&mdev->devnode.dev, &dev_attr_model);
> media_devnode_unregister(&mdev->devnode);
> diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
> index e95070b3a3d4..c53c1d5589a0 100644
> --- a/drivers/media/media-entity.c
> +++ b/drivers/media/media-entity.c
> @@ -219,7 +219,7 @@ int media_entity_pads_init(struct media_entity *entity,
> u16 num_pads, entity->pads = pads;
>
> if (mdev)
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
>
> for (i = 0; i < num_pads; i++) {
> pads[i].entity = entity;
> @@ -230,7 +230,7 @@ int media_entity_pads_init(struct media_entity *entity,
> u16 num_pads, }
>
> if (mdev)
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
>
> return 0;
> }
> @@ -747,9 +747,9 @@ void media_entity_remove_links(struct media_entity
> *entity) if (mdev == NULL)
> return;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
> __media_entity_remove_links(entity);
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> }
> EXPORT_SYMBOL_GPL(media_entity_remove_links);
>
> @@ -951,9 +951,9 @@ void media_remove_intf_link(struct media_link *link)
> if (mdev == NULL)
> return;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
> __media_remove_intf_link(link);
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> }
> EXPORT_SYMBOL_GPL(media_remove_intf_link);
>
> @@ -975,8 +975,8 @@ void media_remove_intf_links(struct media_interface
> *intf) if (mdev == NULL)
> return;
>
> - spin_lock(&mdev->lock);
> + mutex_lock(&mdev->graph_mutex);
> __media_remove_intf_links(intf);
> - spin_unlock(&mdev->lock);
> + mutex_unlock(&mdev->graph_mutex);
> }
> EXPORT_SYMBOL_GPL(media_remove_intf_links);
> diff --git a/include/media/media-device.h b/include/media/media-device.h
> index df74cfa7da4a..0c2de97181f3 100644
> --- a/include/media/media-device.h
> +++ b/include/media/media-device.h
> @@ -25,7 +25,6 @@
>
> #include <linux/list.h>
> #include <linux/mutex.h>
> -#include <linux/spinlock.h>
>
> #include <media/media-devnode.h>
> #include <media/media-entity.h>
> @@ -304,8 +303,7 @@ struct media_entity_notify {
> * @pads: List of registered pads
> * @links: List of registered links
> * @entity_notify: List of registered entity_notify callbacks
> - * @lock: Entities list lock
> - * @graph_mutex: Entities graph operation lock
> + * @graph_mutex: Protects access to struct media_device data
> * @pm_count_walk: Graph walk for power state walk. Access serialised using
> * graph_mutex.
> *
> @@ -371,8 +369,6 @@ struct media_device {
> /* notify callback list invoked when a new entity is registered */
> struct list_head entity_notify;
>
> - /* Protects the graph objects creation/removal */
> - spinlock_t lock;
> /* Serializes graph operations. */
> struct mutex graph_mutex;
> struct media_entity_graph pm_count_walk;
--
Regards,
Laurent Pinchart
prev parent reply other threads:[~2016-03-24 22:11 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-16 12:04 [PATCH 1/5] [media] media-device: get rid of the spinlock Mauro Carvalho Chehab
2016-03-16 12:04 ` [PATCH 2/5] [media] media-device: Fix a comment Mauro Carvalho Chehab
2016-03-16 12:58 ` Javier Martinez Canillas
2016-03-16 12:04 ` [PATCH 3/5] [media] au0828: Unregister notifiers Mauro Carvalho Chehab
2016-03-16 13:11 ` Javier Martinez Canillas
2016-03-22 19:55 ` Shuah Khan
2016-03-16 12:04 ` [PATCH 4/5] [media] media-device: use kref for media_device instance Mauro Carvalho Chehab
2016-03-16 13:23 ` Javier Martinez Canillas
2016-03-16 14:05 ` Shuah Khan
2016-03-16 14:25 ` Mauro Carvalho Chehab
2016-03-16 14:32 ` Shuah Khan
2016-03-17 11:50 ` Sakari Ailus
2016-03-18 11:17 ` Mauro Carvalho Chehab
2016-03-18 13:10 ` Sakari Ailus
2016-03-22 19:56 ` Shuah Khan
2016-03-22 20:07 ` Shuah Khan
2016-03-16 12:04 ` [PATCH 5/5] [media] media-device: make media_device_cleanup() static Mauro Carvalho Chehab
2016-03-16 12:04 ` Mauro Carvalho Chehab
2016-03-16 12:04 ` Mauro Carvalho Chehab
2016-03-16 14:03 ` Javier Martinez Canillas
2016-03-16 14:03 ` Javier Martinez Canillas
2016-03-16 14:03 ` Javier Martinez Canillas
2016-03-16 14:36 ` Mauro Carvalho Chehab
2016-03-16 14:36 ` Mauro Carvalho Chehab
2016-03-16 14:36 ` Mauro Carvalho Chehab
2016-03-16 14:38 ` Javier Martinez Canillas
2016-03-16 14:38 ` Javier Martinez Canillas
2016-03-16 14:38 ` Javier Martinez Canillas
2016-03-22 19:57 ` Shuah Khan
2016-03-22 19:57 ` Shuah Khan
2016-03-22 19:57 ` Shuah Khan
2016-03-16 12:53 ` [PATCH 1/5] [media] media-device: get rid of the spinlock Javier Martinez Canillas
2016-03-16 13:10 ` Mauro Carvalho Chehab
2016-03-16 14:10 ` Sakari Ailus
2016-03-22 19:52 ` Shuah Khan
2016-03-24 22:11 ` Laurent Pinchart [this message]
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=1707571.F8b41vb3Xc@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@infradead.org \
--cc=mchehab@osg.samsung.com \
--cc=shuahkh@osg.samsung.com \
/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.