]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: Tear down devices in the reverse order
authorViresh Kumar <viresh.kumar@linaro.org>
Thu, 4 Jun 2015 12:46:45 +0000 (18:16 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 9 Jun 2015 20:31:23 +0000 (13:31 -0700)
Normally, its a good practice to free resources in the reverse order in
which they are allocated, so that all the dependencies can be sorted out
properly.

This is true while creating/destroying devices as well. For example
consider this scenario (I faced a crash with control protocol due to
this). For a new module, we will first create a bundle+connection for
the control cport and then create other bundles/connections after
parsing manifest.

And while destroying interface on module hot unplug, we are removing the
devices in the order they are added. And so the bundle/connection for
the control cport are destroyed first. But, control cport was still
required while destroying other bundles/connections.

To solve this problem, lets destroy the resources in the reverse order
in which they are added.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/bundle.c
drivers/staging/greybus/connection.c
drivers/staging/greybus/interface.c

index 2047e173ebd922c932bdc1934033e9a46eac57d6..a6b1b347097aa75c37337754c2ab5c3f4c4dd7ca 100644 (file)
@@ -196,7 +196,7 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
        }
 
        spin_lock_irq(&gb_bundles_lock);
-       list_add_tail(&bundle->links, &intf->bundles);
+       list_add(&bundle->links, &intf->bundles);
        spin_unlock_irq(&gb_bundles_lock);
 
        return bundle;
index a774f677279a3df8fc0e777f38da5763ba7b7a3b..5ab744b14a0d5c401b2f6d05804905f258a10bda 100644 (file)
@@ -213,8 +213,8 @@ struct gb_connection *gb_connection_create(struct gb_bundle *bundle,
                         "protocol 0x%02hhx handler not found\n", protocol_id);
 
        spin_lock_irq(&gb_connections_lock);
-       list_add_tail(&connection->hd_links, &hd->connections);
-       list_add_tail(&connection->bundle_links, &bundle->connections);
+       list_add(&connection->hd_links, &hd->connections);
+       list_add(&connection->bundle_links, &bundle->connections);
        spin_unlock_irq(&gb_connections_lock);
 
        atomic_set(&connection->op_cycle, 0);
index 7a4c7dc2e9412387fb6e8d46bfea80ec53dcc78a..3483f848240b01539ae67acb16b260904abb59de 100644 (file)
@@ -122,7 +122,7 @@ static struct gb_interface *gb_interface_create(struct greybus_host_device *hd,
        }
 
        spin_lock_irq(&gb_interfaces_lock);
-       list_add_tail(&intf->links, &hd->interfaces);
+       list_add(&intf->links, &hd->interfaces);
        spin_unlock_irq(&gb_interfaces_lock);
 
        return intf;