diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2015-06-04 18:16:45 +0530 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@google.com> | 2015-06-09 13:31:23 -0700 |
commit | 928f2abd5ff12fa4851b762df7c32e749e846b7c (patch) | |
tree | 68fb3fc47c0a657ef41471bca2709eb5ac3c9a9a /drivers | |
parent | d51c0ffb5cd1e92884e847f2cac6935c6d866779 (diff) | |
download | op-kernel-dev-928f2abd5ff12fa4851b762df7c32e749e846b7c.zip op-kernel-dev-928f2abd5ff12fa4851b762df7c32e749e846b7c.tar.gz |
greybus: Tear down devices in the reverse order
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/greybus/bundle.c | 2 | ||||
-rw-r--r-- | drivers/staging/greybus/connection.c | 4 | ||||
-rw-r--r-- | drivers/staging/greybus/interface.c | 2 |
3 files changed, 4 insertions, 4 deletions
diff --git a/drivers/staging/greybus/bundle.c b/drivers/staging/greybus/bundle.c index 2047e17..a6b1b34 100644 --- a/drivers/staging/greybus/bundle.c +++ b/drivers/staging/greybus/bundle.c @@ -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; diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index a774f67..5ab744b 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -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); diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index 7a4c7dc..3483f848 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -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; |