greybus: interface: remove useless spinlock
authorJohan Hovold <johan@hovoldconsulting.com>
Wed, 9 Mar 2016 11:20:40 +0000 (12:20 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 10 Mar 2016 21:57:42 +0000 (13:57 -0800)
Remove useless global interface spinlock that appeared to protect the
host-device interface list, but really did not as we are doing lock-less
look-ups by relying on the single-threaded SVC workqueue.

Document the locking assumptions.

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/interface.c

index 2654fa8..4671f40 100644 (file)
@@ -54,9 +54,6 @@ static struct attribute *interface_attrs[] = {
 ATTRIBUTE_GROUPS(interface);
 
 
-/* XXX This could be per-host device */
-static DEFINE_SPINLOCK(gb_interfaces_lock);
-
 // FIXME, odds are you don't want to call this function, rework the caller to
 // not need it please.
 struct gb_interface *gb_interface_find(struct gb_host_device *hd,
@@ -100,6 +97,9 @@ struct device_type greybus_interface_type = {
  *
  * Returns a pointer to the new interfce or a null pointer if a
  * failure occurs due to memory exhaustion.
+ *
+ * Locking: Caller ensures serialisation with gb_interface_remove and
+ * gb_interface_find.
  */
 struct gb_interface *gb_interface_create(struct gb_host_device *hd,
                                         u8 interface_id)
@@ -132,9 +132,7 @@ struct gb_interface *gb_interface_create(struct gb_host_device *hd,
                return NULL;
        }
 
-       spin_lock_irq(&gb_interfaces_lock);
        list_add(&intf->links, &hd->interfaces);
-       spin_unlock_irq(&gb_interfaces_lock);
 
        return intf;
 }
@@ -164,9 +162,7 @@ void gb_interface_remove(struct gb_interface *intf)
 
        gb_control_disable(intf->control);
 
-       spin_lock_irq(&gb_interfaces_lock);
        list_del(&intf->links);
-       spin_unlock_irq(&gb_interfaces_lock);
 
        put_device(&intf->dev);
 }