[alsa-devel] [PATCH v2 05/19] media: Convert graph_mutex to a spinlock and call it graph_lock
Shuah Khan
shuahkh at osg.samsung.com
Thu Jul 23 00:42:06 CEST 2015
ALSA driver calls Media Controller start/stop pipeline
interfaces from IRQ handler. Start/stop pipeline lock
graph_mutex which is unsafe from a IRQ handler. Convert
graph_mutex into a spinlock and call it graph_lock. IRQ
safe start/stop pipeline interfaces will be added based
on this change.
Signed-off-by: Shuah Khan <shuahkh at osg.samsung.com>
---
drivers/media/media-device.c | 14 +++++++-------
drivers/media/media-entity.c | 18 +++++++++---------
include/media/media-device.h | 4 ++--
3 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c
index 22565a8..b0fafd7 100644
--- a/drivers/media/media-device.c
+++ b/drivers/media/media-device.c
@@ -251,17 +251,17 @@ static long media_device_ioctl(struct file *filp, unsigned int cmd,
break;
case MEDIA_IOC_ENUM_LINKS:
- mutex_lock(&dev->graph_mutex);
+ spin_lock(&dev->graph_lock);
ret = media_device_enum_links(dev,
(struct media_links_enum __user *)arg);
- mutex_unlock(&dev->graph_mutex);
+ spin_unlock(&dev->graph_lock);
break;
case MEDIA_IOC_SETUP_LINK:
- mutex_lock(&dev->graph_mutex);
+ spin_lock(&dev->graph_lock);
ret = media_device_setup_link(dev,
(struct media_link_desc __user *)arg);
- mutex_unlock(&dev->graph_mutex);
+ spin_unlock(&dev->graph_lock);
break;
default:
@@ -315,10 +315,10 @@ static long media_device_compat_ioctl(struct file *filp, unsigned int cmd,
return media_device_ioctl(filp, cmd, arg);
case MEDIA_IOC_ENUM_LINKS32:
- mutex_lock(&dev->graph_mutex);
+ spin_lock(&dev->graph_lock);
ret = media_device_enum_links32(dev,
(struct media_links_enum32 __user *)arg);
- mutex_unlock(&dev->graph_mutex);
+ spin_unlock(&dev->graph_lock);
break;
default:
@@ -383,7 +383,7 @@ int __must_check __media_device_register(struct media_device *mdev,
INIT_LIST_HEAD(&mdev->entities);
INIT_LIST_HEAD(&mdev->entity_notify);
spin_lock_init(&mdev->lock);
- mutex_init(&mdev->graph_mutex);
+ spin_lock_init(&mdev->graph_lock);
/* Register the device node. */
mdev->devnode.fops = &media_device_fops;
diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
index 4d8e01c..31132573 100644
--- a/drivers/media/media-entity.c
+++ b/drivers/media/media-entity.c
@@ -230,7 +230,7 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
struct media_entity *entity_err = entity;
int ret;
- mutex_lock(&mdev->graph_mutex);
+ spin_lock(&mdev->graph_lock);
media_entity_graph_walk_start(&graph, entity);
@@ -303,7 +303,7 @@ __must_check int media_entity_pipeline_start(struct media_entity *entity,
}
}
- mutex_unlock(&mdev->graph_mutex);
+ spin_unlock(&mdev->graph_lock);
return 0;
@@ -327,7 +327,7 @@ error:
break;
}
- mutex_unlock(&mdev->graph_mutex);
+ spin_unlock(&mdev->graph_lock);
return ret;
}
@@ -350,7 +350,7 @@ void media_entity_pipeline_stop(struct media_entity *entity)
struct media_device *mdev = entity->parent;
struct media_entity_graph graph;
- mutex_lock(&mdev->graph_mutex);
+ spin_lock(&mdev->graph_lock);
media_entity_graph_walk_start(&graph, entity);
@@ -360,7 +360,7 @@ void media_entity_pipeline_stop(struct media_entity *entity)
entity->pipe = NULL;
}
- mutex_unlock(&mdev->graph_mutex);
+ spin_unlock(&mdev->graph_lock);
}
EXPORT_SYMBOL_GPL(media_entity_pipeline_stop);
@@ -519,9 +519,9 @@ void media_entity_remove_links(struct media_entity *entity)
if (entity->parent == NULL)
return;
- mutex_lock(&entity->parent->graph_mutex);
+ spin_lock(&entity->parent->graph_lock);
__media_entity_remove_links(entity);
- mutex_unlock(&entity->parent->graph_mutex);
+ spin_unlock(&entity->parent->graph_lock);
}
EXPORT_SYMBOL_GPL(media_entity_remove_links);
@@ -611,9 +611,9 @@ int media_entity_setup_link(struct media_link *link, u32 flags)
{
int ret;
- mutex_lock(&link->source->entity->parent->graph_mutex);
+ spin_lock(&link->source->entity->parent->graph_lock);
ret = __media_entity_setup_link(link, flags);
- mutex_unlock(&link->source->entity->parent->graph_mutex);
+ spin_unlock(&link->source->entity->parent->graph_lock);
return ret;
}
diff --git a/include/media/media-device.h b/include/media/media-device.h
index a3854f6..e73642c 100644
--- a/include/media/media-device.h
+++ b/include/media/media-device.h
@@ -50,7 +50,7 @@ struct media_entity_notify {
* @entity_id: ID of the next entity to be registered
* @entities: List of registered entities
* @lock: Entities list lock
- * @graph_mutex: Entities graph operation lock
+ * @graph_lock: Entities graph operation lock
* @link_notify: Link state change notification callback
*
* This structure represents an abstract high-level media device. It allows easy
@@ -82,7 +82,7 @@ struct media_device {
/* Protects the entities list */
spinlock_t lock;
/* Serializes graph operations. */
- struct mutex graph_mutex;
+ spinlock_t graph_lock;
int (*link_notify)(struct media_link *link, u32 flags,
unsigned int notification);
--
2.1.4
More information about the Alsa-devel
mailing list