summaryrefslogtreecommitdiff
path: root/patches.tizen/0204-media-media-Add-a-function-removing-all-links-of-a-m.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0204-media-media-Add-a-function-removing-all-links-of-a-m.patch')
-rw-r--r--patches.tizen/0204-media-media-Add-a-function-removing-all-links-of-a-m.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/patches.tizen/0204-media-media-Add-a-function-removing-all-links-of-a-m.patch b/patches.tizen/0204-media-media-Add-a-function-removing-all-links-of-a-m.patch
new file mode 100644
index 00000000000..279f5893fb6
--- /dev/null
+++ b/patches.tizen/0204-media-media-Add-a-function-removing-all-links-of-a-m.patch
@@ -0,0 +1,110 @@
+From 832148209949f030c09b69b60cca64415f63e9cd Mon Sep 17 00:00:00 2001
+From: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Date: Thu, 9 May 2013 08:29:32 -0300
+Subject: [PATCH 0204/1302] [media] media: Add a function removing all links of
+ a media entity
+
+This function allows to remove all media entity's links to other
+entities, leaving no references to a media entity's links array
+at its remote entities.
+Currently, when a driver of some entity is removed it will free its
+media entities links[] array, leaving dangling pointers at other
+entities that are part of same media graph. This is troublesome when
+drivers of a media device entities are in separate kernel modules,
+removing only some modules will leave others in an incorrect state.
+This function is intended to be used when an entity is being
+unregistered from a media device.
+With an assumption that normally the media links should be created
+between media entities registered to a media device, with the graph
+mutex held.
+
+Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Sakari Ailus <sakari.ailus@iki.fi>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/media/media-entity.c | 50 ++++++++++++++++++++++++++++++++++++++++++++
+ include/media/media-entity.h | 3 +++
+ 2 files changed, 53 insertions(+)
+
+diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c
+index 0438209..987df7d3 100644
+--- a/drivers/media/media-entity.c
++++ b/drivers/media/media-entity.c
+@@ -429,6 +429,56 @@ media_entity_create_link(struct media_entity *source, u16 source_pad,
+ }
+ EXPORT_SYMBOL_GPL(media_entity_create_link);
+
++void __media_entity_remove_links(struct media_entity *entity)
++{
++ unsigned int i;
++
++ for (i = 0; i < entity->num_links; i++) {
++ struct media_link *link = &entity->links[i];
++ struct media_entity *remote;
++ unsigned int r = 0;
++
++ if (link->source->entity == entity)
++ remote = link->sink->entity;
++ else
++ remote = link->source->entity;
++
++ while (r < remote->num_links) {
++ struct media_link *rlink = &remote->links[r];
++
++ if (rlink != link->reverse) {
++ r++;
++ continue;
++ }
++
++ if (link->source->entity == entity)
++ remote->num_backlinks--;
++
++ if (--remote->num_links == 0)
++ break;
++
++ /* Insert last entry in place of the dropped link. */
++ *rlink = remote->links[remote->num_links];
++ }
++ }
++
++ entity->num_links = 0;
++ entity->num_backlinks = 0;
++}
++EXPORT_SYMBOL_GPL(__media_entity_remove_links);
++
++void media_entity_remove_links(struct media_entity *entity)
++{
++ /* Do nothing if the entity is not registered. */
++ if (entity->parent == NULL)
++ return;
++
++ mutex_lock(&entity->parent->graph_mutex);
++ __media_entity_remove_links(entity);
++ mutex_unlock(&entity->parent->graph_mutex);
++}
++EXPORT_SYMBOL_GPL(media_entity_remove_links);
++
+ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
+ {
+ int ret;
+diff --git a/include/media/media-entity.h b/include/media/media-entity.h
+index 4eefedc..06bacf9 100644
+--- a/include/media/media-entity.h
++++ b/include/media/media-entity.h
+@@ -128,6 +128,9 @@ void media_entity_cleanup(struct media_entity *entity);
+
+ int media_entity_create_link(struct media_entity *source, u16 source_pad,
+ struct media_entity *sink, u16 sink_pad, u32 flags);
++void __media_entity_remove_links(struct media_entity *entity);
++void media_entity_remove_links(struct media_entity *entity);
++
+ int __media_entity_setup_link(struct media_link *link, u32 flags);
+ int media_entity_setup_link(struct media_link *link, u32 flags);
+ struct media_link *media_entity_find_link(struct media_pad *source,
+--
+1.8.3.2
+