summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2015-12-07 15:05:40 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2015-12-08 15:56:38 -0500
commit1db1b24304a064b9b4213ba1812450ac054c2c58 (patch)
tree08ac8c616852c704b07442c81ce7d4156ddf295e /drivers/staging/greybus
parent1e6fb9a1451f01f8ea092e49f27338ef9d3c7811 (diff)
downloadlinux-stable-1db1b24304a064b9b4213ba1812450ac054c2c58.tar.gz
linux-stable-1db1b24304a064b9b4213ba1812450ac054c2c58.tar.bz2
linux-stable-1db1b24304a064b9b4213ba1812450ac054c2c58.zip
greybus: bundle: kill the bundle lock
Kill the bundle lock, which looked like it protected the interface bundle lists but really did not as lock-less manipulations were still made. No locking for the interface bundle list is in fact needed as bundles are created along with the interface, and the list is only used to check for duplicate bundle ids when parsing the manifest and to destroy the bundles when removing the interface itself. Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus')
-rw-r--r--drivers/staging/greybus/bundle.c33
-rw-r--r--drivers/staging/greybus/bundle.h2
2 files changed, 13 insertions, 22 deletions
diff --git a/drivers/staging/greybus/bundle.c b/drivers/staging/greybus/bundle.c
index d7975edb3230..c2dbd24a80d5 100644
--- a/drivers/staging/greybus/bundle.c
+++ b/drivers/staging/greybus/bundle.c
@@ -65,6 +65,19 @@ static struct attribute *bundle_attrs[] = {
ATTRIBUTE_GROUPS(bundle);
+static struct gb_bundle *gb_bundle_find(struct gb_interface *intf,
+ u8 bundle_id)
+{
+ struct gb_bundle *bundle;
+
+ list_for_each_entry(bundle, &intf->bundles, links) {
+ if (bundle->id == bundle_id)
+ return bundle;
+ }
+
+ return NULL;
+}
+
static void gb_bundle_release(struct device *dev)
{
struct gb_bundle *bundle = to_gb_bundle(dev);
@@ -78,9 +91,6 @@ struct device_type greybus_bundle_type = {
.release = gb_bundle_release,
};
-/* XXX This could be per-host device or per-module */
-static DEFINE_SPINLOCK(gb_bundles_lock);
-
/*
* Create a gb_bundle structure to represent a discovered
* bundle. Returns a pointer to the new bundle or a null
@@ -127,9 +137,7 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
return NULL;
}
- spin_lock_irq(&gb_bundles_lock);
list_add(&bundle->links, &intf->bundles);
- spin_unlock_irq(&gb_bundles_lock);
return bundle;
}
@@ -149,25 +157,10 @@ static void gb_bundle_connections_exit(struct gb_bundle *bundle)
*/
void gb_bundle_destroy(struct gb_bundle *bundle)
{
- spin_lock_irq(&gb_bundles_lock);
list_del(&bundle->links);
- spin_unlock_irq(&gb_bundles_lock);
gb_bundle_connections_exit(bundle);
device_unregister(&bundle->dev);
}
-struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id)
-{
- struct gb_bundle *bundle;
- spin_lock_irq(&gb_bundles_lock);
- list_for_each_entry(bundle, &intf->bundles, links)
- if (bundle->id == bundle_id)
- goto found;
- bundle = NULL;
-found:
- spin_unlock_irq(&gb_bundles_lock);
-
- return bundle;
-}
diff --git a/drivers/staging/greybus/bundle.h b/drivers/staging/greybus/bundle.h
index 70d7b9d897da..eae375c12100 100644
--- a/drivers/staging/greybus/bundle.h
+++ b/drivers/staging/greybus/bundle.h
@@ -33,6 +33,4 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
u8 class);
void gb_bundle_destroy(struct gb_bundle *bundle);
-struct gb_bundle *gb_bundle_find(struct gb_interface *intf, u8 bundle_id);
-
#endif /* __BUNDLE_H */