greybus: bundle: kill the bundle lock
authorJohan Hovold <johan@hovoldconsulting.com>
Mon, 7 Dec 2015 14:05:40 +0000 (15:05 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 8 Dec 2015 20:56:38 +0000 (15:56 -0500)
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>
drivers/staging/greybus/bundle.c
drivers/staging/greybus/bundle.h

index d7975edb32300b00d21c398916f7e778bf7a5de7..c2dbd24a80d5b4fe454ab41ea6ec18e83d9d882a 100644 (file)
@@ -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;
-}
index 70d7b9d897daea589c4470dd01f0d8f2c0140508..eae375c12100eac3ad8754cf78529cef7673a723 100644 (file)
@@ -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 */